在Perl中记录未捕获的异常

Joe*_*Fan 1 perl exception-handling

我有一个Perl Web应用程序,并希望记录所有未捕获的异常(uneval'ed die's).我的第一个想法是做这样的事情:

use Carp 'cluck';

sub main {
    my $logfile ="/some/path/logfile.txt";
    open STDERR, ">>$logfile";
    # main logic
    ...
}

sub eval_main {
   eval {
       main;
   };
   if ($@) {
       cluck $@;
       close STDERR;
       # redirect to "friendly error page"
       ....
   }
 }

 eval_main;
Run Code Online (Sandbox Code Playgroud)

有比这更好的方法吗?

编辑:添加重定向

soc*_*pet 5

只需使用$SIG{__DIE__}处理程序.请参阅perlvar中的%SIG:

$SIG{__DIE__} = sub {
    open LOG, ">>my/error.log";
    print LOG @_;
    close LOG;
    print STDERR @_;
    exit 1;
};

sub main {
    ...
}

main();
Run Code Online (Sandbox Code Playgroud)

  • 这也触发了*caught*异常; 请参阅http://perldoc.perl.org/perlvar.html#%SIG中的警告并确保检查$ ^ S (4认同)