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(); } }