2009-10-20 91 views
8

我必须理解错误的警告文档。我读的方式,这样的代码:警告:: Perl中的警告和致命类别

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 

somone能帮助我理解为什么我不能警告死吗?

+0

严重的警告足以致命,听起来像*错误*。这是区别,警告*不是致命的。 – pavium 2009-10-20 04:20:05

+4

@pavium:有区别,但警告杂注的致命选项旨在提升对错误的警告。 – ysth 2009-10-20 05:24:12

回答

12

好的。这很丑陋。我有一篇文章半解释说这是一个在warnings中的bug,然后我意识到它不是,它只是一个真正的邪恶warnings作品中的微妙之处。

警告开始寻找一个相关的堆栈帧,从warnings::warn来电者的调用者那里获取警告位。这个想法是,你正在编写一些模块,并且在你的函数中使用了warnings::warnwarnings::warnif,并且是否打印(或致命)警告取决于的设置,其范围在范围内,它是使用模块的代码。没有选项提供它开始在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"; 

而且你不能打败它的工作原理是只需添加另一个级别的方式的子程序,因为它需要第一个呼叫者的标记,它来自warn/warnif/enable/etc的调用者的不同包

+0

你可以把它包装在一个毫无意义的子文件中。 '次级保释{使用警告FATAL =>全部; sub {warnings :: warn('DANGER')} - >()}' – 2009-10-20 05:05:41

+1

@hobbs:你明白了。警告程序包中的子程序旨在供模块开发人员使用,而不是某种超级警告()。 – ysth 2009-10-20 05:22:54

+0

这不是一个错误,它是一个(你说的邪恶的微妙)功能。感谢您的解释。 – lexu 2009-10-20 06:50:48