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

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

问题描述:

似乎PHP的错误抑制程序@仍然触发我的自定义错误处理程序,虽然它不显示屏幕上的错误。防止@触发自定义错误处理程序

例子:

@json_decode(array());

这不会在屏幕上输出错误信息,但它仍然会运行我的错误处理程序(例如,记录错误,给我发邮件,脚本终止,好像有一个“真正的”错误)。

@完全沉默吗?

+2

你实际上应该得到一个-1来使用@首先 – w00 2012-08-11 19:25:41

+0

@ w00你应该得到-1因为没有别的办法,看这里http://*.com/questions/2348152/detect-bad-json- data-in-php-json-decode +1对我来说:-) – IMB 2012-08-11 19:27:29

+0

wtf你在说什么。在那个话题中,OP显然存在问题,他将'array'传递给'json_decode'函数而不是字符串。难怪它吐出一个错误。只要确保$变量实际上是字符串类型。 -2为你:-) – w00 2012-08-11 19:39:28

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

但是,您可以隔离这些错误并自行承担风险而忽略它们。

将下面的代码在你的错误处理程序:

// 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是第一个参数错误处理程序回调。

+0

$ level == 0是不必要的。你可以写如果语句如下:if($ level&$ errno) – bobwienholt 2012-08-11 19:37:35

如果你想检测有效的json然后atleat确保你传递给json_decode的“参数”是字符串类型。从php.net

引用:

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

因此,如果JSON无法解码,我们正在寻找NULL。因此,无效的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/KJL8st 更改saveData参数去$str1$str2看到不同的结果。

这是检查你是否有有效的json的方法。不要单独依靠json_decode()函数来告诉你它是否有效数据。这是一个函数,它只是期望一个字符串。所以确保你传入一个字符串。只有这样它才能告诉你它是否有效。

+0

这些也是有效的json,但在你的示例中会失败''str ='';''''或'$ str = null;' – IMB 2012-08-11 21:43:24

+0

@IMB - 那些示例不是有效的JSON。 JSON文本的最外层必须是数组或对象。参见[规范](http://www.ietf.org/rfc/rfc4627.txt)的第二部分(JSON语法)第二节。 – Quentin 2012-08-11 21:58:10

+0

@Quentin要清楚0'json_encode($ str)'使得它们有效的JSON。现在,当你在上面的脚本中运行它时,它们将失败。 – IMB 2012-08-12 08:45:00