# be nice to callers - don't wipe out $@ for them local $@; eval { # ... do some stuff ... # make sure we only return false if we die before # the end return 1; } or do { #handle errors here } #### local $@; eval { # ... do something ... return 1; } or do { my $err=$@; #prevent reset while evaluating if conditions if (!$err) { die Exception::Unknown->new(); } elsif (!Scalar::Util::blessed($err)) { #ugly string regex processing here } elsif ($err->isa('BadParameterException')) { #handle bad parameters } elsif ($err->isa('IOException')) { #handle IO exceptions } elsif #... yada yada } else { die Exception::Unknown->new(); } }