阻止@触发自定义错误处理程序

时间:2012-08-11 19:23:40

标签: php

似乎PHP的错误抑制器@仍在触发我的自定义错误处理程序,尽管它不会在屏幕上显示错误。

示例:

@json_decode(array());

这不会在屏幕上输出错误消息,但它仍会运行我的错误处理程序(例如,记录错误,发送电子邮件,终止脚本执行,就像有“真正的”错误一样)。

@是否有办法完全沉默?

2 个答案:

答案 0 :(得分:3)

如果您正在尝试检测有效的json,那么请确保传递给json_decode的“参数”是字符串类型。

引自php.net:

  

以适当的PHP类型返回json中编码的值。值   true,false和null(不区分大小写)返回为TRUE,FALSE   和NULL分别。如果无法解码json,则返回NULL   或者如果编码数据比递归限制更深。

如果NULL无法解码,我们正在寻找JSON。因此,JSON无效。但同样,请确保传入一个字符串而不是其他类型,如数组或布尔值等。因为那永远不会奏效。

我理解你的问题。 @符号会抑制错误消息,但不会抑制实际的代码流。它出错时仍然会退出。但你真的只需放开@符号。

所以无论如何,你可能会有一些你称之为功能的功能,包括json_decode。这只是一个例子,但它应该让你知道我的意思。

<?php

// will fail, because it's not a string
$str1 = array ( "nooblol" ); 

// Will succeed. This is valid json
$str2 = '{"example":"value"}';

// Will fail, is of type string, but still an invalid json format
$str3 = 'invalid json string';

function saveData ( $json )
{
    // Check if the variable that we're about to pass
    // to json_decode() is an actual string. Otherwise we
    // have invalid json data anyway.
    if ( !is_string ( $json ) )
    {
        echo 'Invalid json (or invalid type)';
        return;
    }

    if ( !$obj = json_decode ( $json ) )
    {
        echo 'fail';
        return;
    }

    // Print json object
    print_r($obj);
}

saveData ( $str3 );

?>

实例:http://codepad.viper-7.com/KJL8stsaveData参数更改为$str1$str2以查看不同的结果。

这是检查你是否有有效json的方法。不要完全依赖json_decode()函数来告诉你它是否是有效数据。它是一个函数,它只需要一个字符串。所以一定要传入一个字符串。只有这样它才能告诉你它是否是有效的json。

答案 1 :(得分:2)

我不相信你可以阻止错误处理程序看到被@压制的错误。

然而,您可以隔离这些错误并忽略它们,风险自负。

将以下代码放入错误处理程序中:

// get the current error reporting level
$level = error_reporting();

// if error was supressed or $errno not set in current error level
if ($level == 0 || ($level & $errno) == 0) {
    return true;
}

请注意,$errno是错误处理程序回调的第一个参数。