eval { local $SIG{ALRM} = sub {die "alarm here"}; alarm(5); eval { long_code(); }; # HERE COME FIRST SIGALRM alarm(0); die if $@; # propagate error } # HERE COME SECOND SIGALRM alarm(0); die if $@ && $@ !~ /alarm here/;