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)