eval { ... code that might die ... }; if ($@) { # if we had an error. ... read $@ and decide on what to do ... } #### $SIG{__DIE__} = \&my_death; sub my_death { warn @_; #propagate the message via warn() POSIX::_exit(42); #exit with code 42 } #### sub main { ... main program logic ... } eval { main() }; if ($@) { ... handle any fatal errors ... } #### eval { main() }; if ($@) { warn "FATAL: $@"; ## all I want to do is warn about the fatal. } END { close_all_files(); issue_done_to_server(); }