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