解决方法
PHP的这个功能很疯狂,应该尽可能避免.
Perl有两种例外:致命错误和警告.警告可以由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 (+) }
输出:你好STDERR.
但这不能用于从您调用的代码中删除警告(动态范围).这也不会使用户定义的警告静音.
在这种情况下,您可以为__WARN__伪信号编写处理程序:
use warnings; { local $SIG{__WARN__} = sub { }; foo(); print "bye\n"; } sub foo { warn "hello\n"; 1 + undef; }
输出:在STDOUT上再见.
sub muffle { my $func = shift; local $SIG{__WARN__} = sub { }; return $func->(@_); } muffle(\&foo,1,2,3); # foo(1,3)
然而,这是一件令人难以置信的愚蠢行为:
>警告指出潜在的问题和错误.修复那些而不是忽略它们.
>对于您不感兴趣的类别,请勿首先激活内置警告.很多人都非常高兴unf值字符串化为空字符串,并且不希望任何警告.
这里概述的策略不处理致命异常,而是使用Try::Tiny
.