发出警告:: warnif报告呼叫站点而不是呼叫者

时间:2014-07-17 18:16:41

标签: perl

warnings::warnif从调用者的角度报告(如carp,它在内部使用)。我希望它从本地调用框架的角度报告(如warn)。虽然Carp具有不从某些软件包的角度报告警告的机制,但似乎没有办法反向并告诉它应该从特定的角度报告。

或者,有没有办法让warnings::warnif匹配warn的行为不包括以换行符结尾的邮件的位置信息?我宁愿没有位置而不是误导性的。

上下文以避免这是X Y problem

我有一个使用warnings::register的特定于应用程序的模块,以便我可以从主脚本控制其警告的处理。他们默认将它们提升为FATAL,但用户可以覆盖它并“强制”程序继续。最初我在模块中使用die并在主脚本中有条件地覆盖CORE::GLOBAL::die来发出警告。我切换到warnings::register,因为覆盖die是严厉的,不灵活的,容易出错。

2 个答案:

答案 0 :(得分:1)

die("msg") if warnings::fatal_enabled();
warn("msg") if warnings::enabled();

答案 1 :(得分:0)

ikegami的答案解决了这个问题,但需要为每条警告信息编写大量样板代码。如果Perl有宏,我们可以使用它们来摆脱样板,但它没有(尽管有源过滤器)。使用子例程会更改位置,但我们可以使用caller来获取正确的位置,并模仿warn / die的行为,将其添加到不会结束的邮件中换行符:

sub error {
    unless ($_[-1] =~ /\n$/) {
        my (undef, $file, $line) = caller;
        push @_, " at $file line $line.\n";
    }

    die  @_ if warnings::fatal_enabled();
    warn @_ if warnings::enabled();
}