use Storable;
use MIME::Base64;
use Data::Dumper;
eval {
die encode_base64(freeze({errorcode => 12, errormess => 'you have died'}));
};
print "error caught: ".Dumper(thaw(decode_base64($@))) if $@;
####
use Data::Dumper;
eval {
die {errorcode => 12, errormess => 'you have died'};
};
print "error caught: ".Dumper($@) if $@;
# or even better
eval {
die bless {errorcode => 12, errormess => 'you have died'} => 'My::Exception';
};
print "error caught2: ".$@->{errormess}."\n" if $@ and ref($@) eq 'My::Exception';
##
##
use Storable qw/freeze thaw/;
use MIME::Base64;
use Data::Dumper;
use Benchmark qw/:all/;
use strict;
use warnings;
sub die_bliako_way {
die encode_base64(freeze({errorcode => 12, errormsg => 'you have died'}));
}
sub die_common_sense {
die {errorcode => 12, errormsg => 'you have died'};
}
sub die_common_sense_blessed {
die bless {errorcode => 12, errormsg => 'you have died'} => 'My::Exception';
}
sub no_die {
return {errorcode => 12, errormsg => 'you have died'};
}
timethese(10_000_000, {
'die_bliako_way' => sub {
eval { die_bliako_way };
if( $@ && exists(thaw(decode_base64($@))->{errorcode}) ){ }
},
'die_common_sense' => sub {
eval { die_common_sense };
if( $@ && exists($@->{errorcode}) ){ }
},
'no_die' => sub {
my $ret = no_die();
if( exists $ret->{errorcode} ){ }
}
});
##
##
Benchmark: timing 10000000 iterations of die_bliako_way, die_common_sense, die_common_sense_blessed, no_die...
die_bliako_way: 56 wallclock secs (55.04 usr + 0.01 sys = 55.05 CPU) @ 181653.04/s (n=10000000)
die_common_sense: 5 wallclock secs ( 5.25 usr + 0.00 sys = 5.25 CPU) @ 1904761.90/s (n=10000000)
die_common_sense_blessed: 5 wallclock secs ( 5.36 usr + 0.00 sys = 5.36 CPU) @ 1865671.64/s (n=10000000)
no_die: 5 wallclock secs ( 3.77 usr + 0.00 sys = 3.77 CPU) @ 2652519.89/s (n=10000000)