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