是否有既定的最佳实践来处理 Perl 程序中不同类别的警告,例如记录到系统日志(或实际上任何非标准行为)?
例如,向系统日志发送警告:
$SIG{__WARN__} = sub {
syslog(LOG_ERR,shift);
}
但现在想象一下,并非所有警告都是一样的。有些应该被视为噪音并降级。例如,许多 MIME 警告并不真正表明存在严重问题:
ignoring text in character set `WINDOWS-1252'
at /usr/share/perl5/MIME/Parser/Filer.pm line 659
最好将其记录为 LOG_INFO
或其他一些不会提醒管理员出现问题的优先级。
实现这一目标的最佳方法是什么?
一个简单的解决方案可能是:
$SIG{__WARN__} = sub {
my $msg = shift;
my $prio = $msg =~ /(ignoring|Filer.pm)/ ? LOG_INFO : LOG_ERR;
syslog($prio,$msg)
}
但这需要(IMO)我的代码和它调用的任何库之间的紧密耦合,必须仔细匹配警告消息......而且它也不是很优雅或可维护。
我见过的一个可能的解决方案是,当我控制代码时,它是一个小小的改进,它是确保我的警告都有一个前缀:
warn "MIME parsing error: $@";
这使得警告处理程序更加简单:
$SIG{__WARN__} = sub {
my $msg = shift;
my $prio = $msg =~ /^MIME parsing error:/ ? LOG_INFO : LOG_ERR;
syslog($prio,$msg)
}
但是对警告进行字符串解析以确定其分类似乎仍然不优雅。
有没有更优雅的解决方案?我正在寻找一种通用的最佳实践——即使它需要重写所有发出警告的库。
最佳答案
与异常对象类似,您可以引入警告对象:
$SIG{__WARN__} = sub {
my $w = shift;
if ($w->is_info) {
print STDERR 'INFO:', $w->msg, "\n";
}
};
warn 'My::Warning'->new( msg => 'problem',
severity => 'info',
);
关于perl - Perl 中警告传播的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22238069/