我如何有条件地使警告致命?

迈克尔·卡曼

我想根据用户的偏好设置致命错误,将其降级为警告(或者相反,可以将警告升级为致命错误)。目前,我正在die像这样使用和覆盖它:

my $force;
BEGIN {
    no warnings 'once';
    Getopt::Long::Configure('pass_through');
    GetOptions('force', \$force);
    *CORE::GLOBAL::die = sub { warn @_ } if $force;
    Getopt::Long::Configure('no_pass_through');
}

use My::Module;
...
die "maybe";
...
exit(1) if $force;
exit(0); # success!

我不喜欢这种方法,主要是因为我仍然想死一些地方(例如缺少命令行参数)。我宁愿更改dieto的(大多数)实例warn并执行条件use warnings FATAL => 'all'1问题是,它use warnings在词法上是作用域的,所以这是无效的:

if (!$force) {
    use warnings FATAL => 'all';
}

尝试使用有条件的后缀是语法错误:

use warnings FATAL => 'all' unless $force;

并且use不能在表达式中使用:

$force or use warnings FATAL => 'all';  # syntax error

我可以想到各种令人讨厌的变通方法(定义我自己的警告/死者,在if / else中复制我的主脚本代码等),但是我正在寻找一种优雅的解决方案,有条件地适用use warnings于当前的词法范围。(将它应用于父级范围也可以,但是可能需要使用黑魔法。)


1:实际上,我想添加use warnings::register到模块和use warnings FATAL => 'My::Module'脚本中,但是对于这个问题而言,区别并不重要。

托比墨

您可以尝试:

use if !$force, warnings => qw( FATAL all );

是的,有一个if与Perl一起分发的名为的模块,可以很容易地进行条件导入。

请注意,这是在编译时评估的,因此$force需要在编译时定义。(可能在一个BEGIN { ... }块内。)基于问题中的代码示例,您似乎已经弄清楚了该部分。

或者,更多手册:

BEGIN {
    require warnings;
    warnings->import(qw/ FATAL all /) unless $force;
}

完全不同的方法是使用信号处理程序$SIG{__WARN__}$SIG{__DIE__}在运行时决定是否死亡。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我如何有条件地使警告致命?

来自分类Dev

如何有条件地渲染

来自分类Dev

我如何有条件地加载我的React组件?

来自分类Dev

如何在有条件的js中有条件地应用标题

来自分类Dev

如何在有条件的组件上有条件地添加道具?

来自分类Dev

我想有条件地验证对象

来自分类Dev

如何有条件地读取所有属性?

来自分类Dev

Webpack:我们如何“有条件地”使用插件?

来自分类Dev

我如何有条件地包装此React组件

来自分类Dev

我如何有条件地计算本地反应的状态之一?

来自分类Dev

我如何使用springdoc openapi在swagger ui上有条件地忽略PathVariable

来自分类Dev

我如何才能有条件地连接两个不同的数组?

来自分类Dev

我如何有条件地通过“时间”传递子壳?

来自分类Dev

我如何有条件地为玉中的文本分配颜色

来自分类Dev

我如何有条件地排除咖啡理解项目

来自分类Dev

我应该如何有条件地启用构造函数?

来自分类Dev

如何有条件地应用动画?

来自分类Dev

如何使EditorFor有条件地变为只读状态?

来自分类常见问题

如何有条件地包装React组件?

来自分类Dev

如何有条件地调用spring验证器

来自分类Dev

如何有条件地增加新的列值

来自分类Dev

如何有条件地使用Test :: Simple?

来自分类Dev

如何有条件地捕获异常?

来自分类Dev

如何使autoconf有条件地使用系统扩展?

来自分类Dev

如何有条件地调用sbt中的任务?

来自分类Dev

如何有条件地加载CSS

来自分类Dev

GWT如何有条件地更改文本颜色

来自分类Dev

如何有条件地包括外部javascript文件?

来自分类Dev

如何有条件地定制Application类?