Perl 信号处理程序和评估
Perl sigdie handler and eval
我正在我的 Logger 模块中覆盖我的 SIG 芯片处理程序,如下所示。
# Catch die messages and log them with logdie
$SIG{__DIE__} = \&logdie;
现在按预期在程序 运行 下方调用 post 处理。
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";
但是,如果我包含我的记录器模块并添加 use MyLogger
,则代码在 eval
语句中失败并出现以下错误,并且不会调用 post 处理。
[错误] 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
所以听起来您想在 __DIE__
处理程序的开头检查 $^S
是否为真:
package MyLogger;
sub logdie {
$^S && die $_[0]; # use default die handler
... # else use custom die handler
}
我正在我的 Logger 模块中覆盖我的 SIG 芯片处理程序,如下所示。
# Catch die messages and log them with logdie
$SIG{__DIE__} = \&logdie;
现在按预期在程序 运行 下方调用 post 处理。
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";
但是,如果我包含我的记录器模块并添加 use MyLogger
,则代码在 eval
语句中失败并出现以下错误,并且不会调用 post 处理。
[错误] 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
所以听起来您想在 __DIE__
处理程序的开头检查 $^S
是否为真:
package MyLogger;
sub logdie {
$^S && die $_[0]; # use default die handler
... # else use custom die handler
}