http://www.perlmonks.org?node_id=384313


in reply to Re: the try/catch example from "Programming Perl" analyzed
in thread the try/catch example from "Programming Perl" analyzed

Not sure that the nested if is actually needed. This code works with string and object exceptions (on 5.8.3 at least):
use strict; use warnings; package Exception; package IOException; @IOException::ISA = qw(Exception); package OtherException; package YetAnotherException; package main; *isa = \&UNIVERSAL::isa; my @grisly = ( sub { die "AARRGH!\n" }, sub { die bless [], 'Exception' }, sub { die bless [], 'IOException' }, sub { die bless [], 'OtherException' }, sub { die bless [], 'YetAnotherException' }, sub { print "I live\n"; } ); sub do_something_that_could_die { $grisly[0]->(); # or int(rand(@grisly)) } eval { do_something_that_could_die(); }; if(isa($@, 'Exception')) { print ref($@), ' caught'; } elsif(isa($@, 'OtherException')) { print ref($@), ' caught'; } elsif(ref $@) { # handle any other exception object print ref($@), ' caught'; } elsif($@) { # handle non-object exception print $@; }
Update:
replaced $@->isa('package') calls with calls to UNIVERSAL::isa()