检测错误控制操作员

时间:2009-08-16 09:52:14

标签: php error-handling

请告诉我这是否正确。在我的错误处理程序中,我需要能够检测何时使用@ 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.';
?>

那么......这里没有捕获物吗?除了外部库覆盖我的错误处理的那个..(关于它的任何提示?)

1 个答案:

答案 0 :(得分:1)

考虑一下你的脚本做了什么,以及@ operator manual page上的一些用户注释,看来你正在做的事情就好了。

例如,taras says

  

我对@符号感到困惑   实际上,经过几次   实验结束了   以下内容:

     
      
  • 无论处于什么级别,都会调用所设置的错误处理程序   设置错误报告,或者是否   该声明以@

  • 开头   
  • 由错误处理程序赋予不同的意义   错误级别。你可以做你的   自定义错误处理程序回显所有错   即使错误报告设置为   NONE。

  •   
  • 那么@运营商会做什么?它会临时设置错误报告   该行的级别为0。如果那条线   触发错误,错误处理程序   仍将被召唤,但它会被召唤   调用错误级别为0

  •   

set_error_handler手册页似乎证实:

  

特别需要注意的是,如果该语句,该值将为0   导致错误的是@ error-control操作符。

这里也有一些有用的用户注释;例如,this one (请参阅代码的开头)


但是,如果你想要的是“禁用”@ operator 的效果(不确定我是否正确理解了这个问题;无论如何这可能对你有帮助),以便能够得到错误您在开发环境中的消息,您可以安装尖叫扩展(peclmanual

如果你以正确的方式配置它,在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的应用程序/库上非常有用...