我在perl后端服务中实现了logger。我正在尝试打印local $SIG{__DIE__}=
所包含的内容。
local $SIG{__DIE__}=
捕获以下错误:无法在@INC中找到xyz.pm(@INC包含...............)。
每当我通过命令行运行脚本时,我都看不到终端上生成的上述错误消息。只需本地$ SIG { DIE } =即可抓住此消息。
有没有办法让supress无法找到警告信息?
我试图通过perl doc(Category Hierarchy)http://perldoc.perl.org/perllexwarn.html,但我不知道,找不到属于哪个类别的警告?
答案 0 :(得分:3)
这是一个错误,而不是一个警告。您应该修复此错误,因为在安装所需模块之前,您的脚本不会运行。
如果您只是不想记录该特定消息,您可以跳过任何与一些不感兴趣的消息正则表达式相匹配的内容:
my $uninteresting_re = qr{\ACan't locate \w+(?:/\w+)*[.]pm in \@INC [(]you may need to install};
$SIG{__DIE__} = sub {
my ($error) = @_;
print $log $error unless $error =~ $uninteresting;
# let error propagation continue as usual
};
答案 1 :(得分:1)
如果您实际上不需要故障模块来使代码工作,则可以防止生成“无法定位...”错误。在程序开始时(或者至少在尝试加载缺少的模块之前),添加:
use PerlIO::scalar;
BEGIN {
push @INC, sub { open my $fh, "<", \"1"; return $fh };
}
这会在@INC
的末尾添加一个条目,如果找不到实际文件,它将返回一个空的虚拟文件,因此每个use
(或require
)将始终 找到要加载的内容。
这不是一个好主意。它远远超过远更容易掩盖真正的问题而不是解决任何问题。但是,如果你真的想冒这个风险,可以完成。
答案 2 :(得分:1)
编写$SIG{__DIE__}
处理程序的正确方法始终是查看$^S
的值。这会告诉您当前是否正在运行eval{}
。如果是,你应该忽略它。
因此,任何处理程序必须始终启动
$SIG{__DIE__} = sub {
return if $^S;
...
};