我想编写一个小子例程,它可以以一致的方式修饰所有错误消息,而不必将其全部复制到我的程序中。
但是我希望行号来自调用它的位置,而不是die
/ warn
发生的位置。
在C中,我只使用预处理器宏,但Perl没有这些。实现这个的最佳方法是什么?
答案 0 :(得分:8)
使用Carp警告/错误。您可以使用__WARN__
和__DIE__
挂钩来影响warn
打印到STDERR
流的内容以及如何抛出die
。请注意,它们完全不同。
use warnings;
use strict;
use feature 'say';
use Carp;
$SIG{__WARN__} = \&wrap_warn;
sub wrap_warn {
print "WARNING: @_";
}
sub level_2 {
say "Print from level_2";
carp "carp from level_2(@_)";
}
sub level_1 {
level_2(@_);
}
level_1("from main");
打印到STDOUT
Print from level_2
WARNING: carp from level_2(from main) at wrap_warn.pl line 19.
main::level_2('from main') called at wrap_warn.pl line 15
main::level_1('from main') called at wrap_warn.pl line 22
如果您仍想转到STDERR
,请使用print STDERR "WARNING: @_";
请务必仔细阅读至少%SIG
in perlvar和warn。
虽然您似乎希望这是全球性的,但我想提及local - 如果可能的话,这样的变化通常是人们想要的。 this post中有一个例子,还有更多。
答案 1 :(得分:2)
添加以下内容会将堆栈跟踪添加到异常和警告中:
use Carp::Always;
对于偶尔使用,请使用以下内容以避免修改程序:
perl -MCarp::Always script args
或
PERL5OPT=-MCarp::Always script args