首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >warnings::warn和FATAL类别

warnings::warn和FATAL类别
EN

Stack Overflow用户
提问于 2009-10-20 12:14:18
回答 1查看 363关注 0票数 8

我一定是理解错了警告文档。根据我的理解,这段代码如下:

代码语言:javascript
复制
use warnings;
use warnings FATAL => 'all';
warnings::warn('numeric', 'blarg');
print "finished\n";

应该打印“blarg”警告并终止,因为我已经要求所有警告都是致命的。然而,当我运行我得到的代码时:

代码语言:javascript
复制
$> /opt/local/bin/perl x.pl 
blarg at x.pl line 3
finished

有人能帮我理解为什么我不能被警告去死吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-10-20 04:48:07

好吧。这太难看了。我有一个半准备好的帖子解释说这是warnings中的一个错误,然后我意识到这不是,它只是warnings工作方式中一个非常邪恶的微妙之处。

Warnings开始在warnings::warn的调用者的调用者中寻找相关的堆栈框架来获取警告位。其想法是,您正在编写某个模块,并且在函数中使用warnings::warnwarnings::warnif,并且警告是否被打印(或致命)取决于使用您的模块的代码的作用域中的use warnings设置。没有提供让它从caller(1)而不是caller(2)开始的选项,所以您想要的效果是不可能的。

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

代码语言:javascript
复制
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.的调用者不同的包中

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1592397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档