my $base_class = '...'; # base class for exceptions my $error_class = '...'; # my error class sub rethrow(;$) { my $e = @_ ? $_[0] : $@; die $e if blessed( $e ) && $e->isa( $base_class ); die $error_class->new( $e ); } sub try(&) { my $code = $_[0]; eval { local $SIG{__DIE__} = \&rethrow; &$code(); }; $@; }