包装Perl" die"和#34;警告"在实用程序子程序中

时间:2017-05-16 20:40:15

标签: perl error-handling

我想编写一个小子例程,它可以以一致的方式修饰所有错误消息,而不必将其全部复制到我的程序中。

但是我希望行号来自调用它的位置,而不是die / warn发生的位置。

在C中,我只使用预处理器宏,但Perl没有这些。实现这个的最佳方法是什么?

2 个答案:

答案 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 perlvarwarn

虽然您似乎希望这是全球性的,但我想提及local - 如果可能的话,这样的变化通常是人们想要的。 this post中有一个例子,还有更多。

答案 1 :(得分:2)

添加以下内容会将堆栈跟踪添加到异常和警告中:

use Carp::Always;

对于偶尔使用,请使用以下内容以避免修改程序:

perl -MCarp::Always script args

PERL5OPT=-MCarp::Always script args