在实用程序子例程中包装Perl"die"和"warn"

Prg*_*tas 1 error-handling perl

我想编写一个小的子例程,它可以以一致的方式装饰所有错误消息,而不必在我的程序中复制它.

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

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

zdi*_*dim 9

使用鲤鱼警告/错误.您可以使用__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");
Run Code Online (Sandbox Code Playgroud)

打印到 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
Run Code Online (Sandbox Code Playgroud)

如果你想要这个仍然去STDERR使用print STDERR "WARNING: @_";

请务必仔细阅读有关%SIGperlvar的信息并至少提醒.


虽然现在看来,你希望这是全球性的,我想提一提,当地像这样-izing变化是一个想一般的东西,如果可能的话.这篇文章中有一个例子,还有更多.