【问题标题】:Prevent @ from triggering custom error handler防止@触发自定义错误处理程序
【发布时间】:2012-08-08 15:50:36
【问题描述】:

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

例子:

@json_decode(array());

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

有没有办法让@ 完全保持沉默?

【问题讨论】:

  • 你实际上应该得到一个-1,因为首先使用@
  • @w00 你应该得到-1,因为没有其他办法,看这里stackoverflow.com/questions/2348152/… +1 为我:-)
  • 你在说什么。在该主题中,OP 显然存在问题,即他将 array 传递给 json_decode 函数而不是字符串。难怪它会吐出一个错误。只要确保 $variable 实际上是字符串类型。 -2 给你 :-)
  • @w00 这个例子只是为了演示一个错误,如果你阅读它会显示给你的URL,和这里解决的类似,它也使用@来检测有效的json数据。这个话题非常相关。顺便说一句,我是 OP。 -2 给你 :-)
  • @你不需要它解决不了任何问题。在这种情况下也不是。如果我在家,我会告诉你如何正确地做到这一点。生病保存以备后用。仍然为你准备好。

标签: php


【解决方案1】:

如果您尝试检测有效的 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/KJL8stsaveData 参数更改为$str1$str2 以查看不同的结果。

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

【讨论】:

  • 这些也是有效的 json,但在您的示例中会失败 $str = '';$str = null;
  • @IMB — 这些示例不是有效的 JSON。 JSON 文本的最外层必须是数组或对象。请参阅the specification 的第二部分(JSON 语法)的第二段。
  • @Quentin To be clear0 json_encode($str) 使它们成为有效的 JSON。现在,当您在上面的脚本中运行它时,它们将失败。
  • @IMB — 不,json_encode('')json_encode(null) 不输出有效的 JSON。您可以通过阅读我之前引用的规范部分来确认这一点,或者将输出复制/粘贴到JSON Lint
  • 就像 Quentin 已经说过的,检查 Json 规范。您可以随时检查并查看 PHP 如何处理空字符串:codepad.viper-7.com/FcN625 --- 正如您所见,PHP 完全遵循规范,说空字符串或空值无效。
【解决方案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 是错误处理程序回调的第一个参数。

【讨论】:

  • $level == 0 是不必要的。你可以把 if 语句写成: if ($level & $errno)
猜你喜欢
  • 2013-12-26
  • 1970-01-01
  • 2017-12-18
  • 2012-07-12
  • 1970-01-01
  • 2018-04-29
  • 2011-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多