Pun*_*ngs 3 perl eval log4perl
我在我的Logger模块中覆盖了我的SIG模具处理程序.
# Catch die messages and log them with logdie
$SIG{__DIE__} = \&logdie;
Run Code Online (Sandbox Code Playgroud)
现在,程序按预期运行,将调用后处理.
use strict;
use warnings;
use File::Path;
# use MyLogger;
my $dir="/random";
eval {
# local $SIG{__DIE__};
File::Path::make_path($dir);
};
if($@) {
warn("Cannot create $dir :$@ \n");
}
print "Post processing \n";
Run Code Online (Sandbox Code Playgroud)
但是,如果我包含我的记录器模块并且use MyLogger在eval语句中添加代码失败,则出现以下错误,并且不会调用后处理.
[错误] 2015/04/27 22:19:07 Carp.pm:166> mkdir/random:在./test.pl第11行被拒绝.
修复此问题的一个选项是添加本地sigdie句柄(如注释代码所示).
但是,我的记录器模块被许多脚本使用.
有没有办法修改我的Logger模块,以便在从eval块内部调用时它会抑制ERROR消息?
所述$^S指示当前执行点是否是内部eval块:
$^S State
--------- -------------------------------------
undef Parsing module, eval, or main program
true (1) Executing an eval
false (0) Otherwise
Run Code Online (Sandbox Code Playgroud)
所以听起来你想检查处理程序$^S开头是否为真__DIE__:
package MyLogger;
sub logdie {
$^S && die $_[0]; # use default die handler
... # else use custom die handler
}
Run Code Online (Sandbox Code Playgroud)