请告诉我这是否正确。在我的错误处理程序中,我需要能够检测何时使用@ error-control运算符来抑制错误,因为一些外部库(遗憾地)使用它很多。应该继续执行脚本,就像不使用自定义错误处理程序一样。
当使用at符号时,PHP暂时将error_reporting设置为0.因此,在脚本开始时,我们将error_reporting设置为任何值,但为零 - 我们现在可以做一些漂亮的IF / ELSE魔术。为了避免在前端显示任何错误,我们还将display_errors设置为0,这将覆盖error_reporting(但我们仍然可以使用它的魔法值)。
<?php
ini_set('display_errors',0);
error_reporting(E_ALL);
function error_handler($errno, $errstr, $errfile, $errline)
{
if (error_reporting()===0) return;
else die();
}
set_error_handler('error_handler');
//This issues an error, but the handler will return and execution continues.
//Remove the at-sign and the script will die()
@file();
echo 'Execution continued, hooray.';
?>
那么......这里没有捕获物吗?除了外部库覆盖我的错误处理的那个..(关于它的任何提示?)
答案 0 :(得分:1)
考虑一下你的脚本做了什么,以及@ operator manual page上的一些用户注释,看来你正在做的事情就好了。
例如,taras says:
我对@符号感到困惑 实际上,经过几次 实验结束了 以下内容:
- 开头
无论处于什么级别,都会调用所设置的错误处理程序 设置错误报告,或者是否 该声明以@
由错误处理程序赋予不同的意义 错误级别。你可以做你的 自定义错误处理程序回显所有错 即使错误报告设置为 NONE。
那么@运营商会做什么?它会临时设置错误报告 该行的级别为0。如果那条线 触发错误,错误处理程序 仍将被召唤,但它会被召唤 调用错误级别为0
set_error_handler
手册页似乎证实:
特别需要注意的是,如果该语句,该值将为0 导致错误的是@ error-control操作符。
这里也有一些有用的用户注释;例如,this one (请参阅代码的开头)
但是,如果你想要的是“禁用”@ operator 的效果(不确定我是否正确理解了这个问题;无论如何这可能对你有帮助),以便能够得到错误您在开发环境中的消息,您可以安装尖叫扩展(pecl,manual)
如果你以正确的方式配置它,在php.ini中设置它(当然,在安装/加载扩展后):
scream.enabled = 1
此扩展名只会禁用@运算符。
这是一个例子(引用manual):
<?php
// Make sure errors will be shown
ini_set('display_errors', true);
error_reporting(E_ALL);
// Disable scream - this is the default and produce an error
ini_set('scream.enabled', false);
echo "Opening http://example.com/not-existing-file\n";
@fopen('http://example.com/not-existing-file', 'r');
// Now enable scream and try again
ini_set('scream.enabled', true);
echo "Opening http://example.com/not-existing-file\n";
@fopen('http://example.com/another-not-existing-file', 'r');
?>
这将输出:
Opening http://example.com/not-existing-file
Opening http://example.com/not-existing-file
Warning: fopen(http://example.com/another-not-existing-file): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in example.php on line 14
我不确定我是否会在生产服务器上使用此扩展(我从不希望显示错误),但是在使用旧代码的开发机器上,在使用@ operator extensivly的应用程序/库上非常有用...