In Perl, you also have to handle the condition of a runtime error which is not an object:
You could always encapsulate the extra test in some code:
sub exception (;$) {
my $wanted_exception = shift;
return unless $@;
return 1 unless defined $wanted_exception;
return ref($@) && $@->isa( $wanted_exception )
};
allowing you to do:
eval { $coderef->() };
if ( exception 'IOException' ) {
... handle IOException ...
} elsif ( exception 'OtherException' ) {
... handle OtherException ...
} elsif ( exception ) {
... handle all other exceptions ...
} else {
... we lived ...
};
Sure, you have an extra ref test and subroutine call, but since exceptions should be... well... exceptional it shouldn't impact your runtime speed much.