perl - 如何抑制来自 Perl 函数的警告?

标签 perl error-handling

在 PHP 中你可以使用 @在函数调用之前抑制返回的警告。

Perl 中有类似的东西吗?

最佳答案

PHP 的这个特性很疯狂,应该尽可能避免。

Perl 有两种异常: fatal error 和警告。警告可能由 Perl 本身发出,也可能由用户代码发出。

在某个静态/词法范围内,Perl 的内置警告可以像这样关闭:

use warnings;

foo();

sub foo {
  no warnings 'uninitialized';  # recommended: only switch of specific categories
  warn "hello\n";
  1 + undef;  # Otherwise: Use of uninitialized value in addition (+)
}

输出:hello在 STDERR 上。

(可以找到所有警告类别的列表 here )

但这不能用于从您正在调用的代码中删除警告(动态范围)。这也不会使用户定义的警告静音。

在这种情况下,您可以为 __WARN__ 编写处理程序。伪信号:
use warnings;
{
  local $SIG{__WARN__} = sub { };
  foo();
  print "bye\n";
}

sub foo {
  warn "hello\n";
  1 + undef;
}

输出:bye在标准输出上。

我们可以把它抽象成一个函数muffle :
sub muffle {
  my $func = shift;
  local $SIG{__WARN__} = sub { };
  return $func->(@_);
}

muffle(\&foo, 1, 2, 3); # foo(1, 2, 3)

然而,这是一件非常愚蠢的事情:
  • 警告指出潜在的问题和错误。修复这些而不是忽略它们。
  • 不要首先为您不感兴趣的类别激活内置警告。例如许多人非常高兴undef value 字符串化为空字符串,并且不想要任何警告。

  • 此处概述的策略不处理致命异常,请使用 Try::Tiny 反而。

    关于perl - 如何抑制来自 Perl 函数的警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19490351/

    相关文章:

    ruby-on-rails - rails : Restoring contents of non-model form that uses form_tag

    jQuery 表单验证 : Define container for errors

    c# - ASP.NET Core - 同时使用 UseDeveloperExceptionPage() 和自定义日志记录

    perl - 我们可以在 Perl 中同时运行两个非嵌套循环吗?

    windows - 如何在 Perl 中编写 *filename* 包含 utf8 字符的文件?

    perl - 如何手动安装 XS 模块?

    matlab - 在Matlab中使用递归算法获得更多详细错误消息吗?

    javascript - 在 JavaScript 中抛出多个异常

    perl - Getopts 在没有破折号的情况下标记错误的选项

    perl - 从 perl 子例程返回错误消息