3

我在我的 Logger 模块中覆盖了我的 SIG die 处理程序,如下所示。

# Catch die messages and log them with logdie
$SIG{__DIE__} = \&logdie;

现在下面的程序按预期运行,将调用后处理。

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并出现以下错误并且不会调用后处理。

[错误] 2015/04/27 22:19:07 Carp.pm:166> mkdir /random: Permission denied at ./test.pl line 11.

解决此问题的一个选项是添加本地 sigdie 句柄(如注释代码中所示)。

但是,我的记录器模块被许多脚本使用。

有没有办法修改我的 Logger 模块,以便在从 eval 块内部调用时抑制 ERROR 消息?

4

1 回答 1

7

指示当前$^S执行点是否在eval块内:

$^S         State
---------   -------------------------------------
undef       Parsing module, eval, or main program
true (1)    Executing an eval
false (0)   Otherwise

所以听起来你想在处理程序$^S的开头检查是否为真__DIE__

package MyLogger;
sub logdie {
    $^S && die $_[0];    # use default die handler
    ...                  # else use custom die handler
}
于 2015-04-28T02:42:33.257 回答