警告:: Perl中的warn和FATAL类别

时间:2009-10-20 04:14:18

标签: perl warnings

我必须理解错误的警告文档。我读它的方式,这段代码:

use warnings;
use warnings FATAL => 'all';
warnings::warn('numeric', 'blarg');
print "finished\n";

应该打印'blarg'警告并且死亡,因为我要求所有警告都是致命的。但是,当我运行代码时,我得到:

$> /opt/local/bin/perl x.pl 
blarg at x.pl line 3
finished

能否帮助我理解为什么我不能被警告死?

1 个答案:

答案 0 :(得分:12)

好。这很难看。我有一个半篇文章准备解释这是warnings中的一个错误,然后我意识到它不是,它只是一个真正的邪恶的微妙的warnings工作方式。 / p>

警告开始寻找相关的堆栈帧,以便从warnings::warn来电者的来电中获取警告位。我们的想法是,您正在编写一些模块,并在函数中使用warnings::warnwarnings::warnif,并且警告是否打印(或致命)取决于use warnings设置范围使用您的模块的代码。没有选项让它从caller(1)而不是caller(2)开始,因此无法实现您想要的效果。

一个有效的代码示例(并演示了编写它的人应该如何使用此接口):

package Foo;
require warnings;

sub bail {
  warnings::warnif('numeric', "You fool! You divided by zero!");
}

package main;
use warnings FATAL => all;

Foo::bail();
print "Will never be reached\n";

你不能通过添加另一个级别的子程序来打败它的工作方式,因为它从{{1}的调用者那里获取来自不同包中的第一个调用者的标记} / warn / warnif /等