代码之家  ›  专栏  ›  技术社区  ›  Josh McAdams

警告::Perl中的警告和致命类别

  •  8
  • Josh McAdams  · 技术社区  · 16 年前

    我一定是理解错了。按照我的理解,这段代码:

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

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

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

    1 回复  |  直到 16 年前
        1
  •  12
  •   hobbs    16 年前

    可以这太难看了。我有一篇半准备好的帖子,解释这是一个错误 warnings 恶毒的 警告 作品

    警告开始查找相关堆栈帧,以从中获取警告位 warnings::warn 来电者 呼叫者这个想法是,你正在编写一些模块,你使用 警告::警告 warnings::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";
    

    你不能仅仅通过添加另一个级别的子例程来改变它的工作方式,因为它从一个调用中的第一个调用方获取标志 不同的包装 从打电话的人那里 warn / warnif enable