【问题标题】:Prevent PHP warnings and errors from breaking json parser?防止 PHP 警告和错误破坏 json 解析器?
【发布时间】:2017-07-24 23:33:23
【问题描述】:

我有一个 php 脚本,它从数据库中读取记录并返回一个 json 对象。我在脚本中有错误处理,因此如果抛出异常或发生其他错误,我仍然返回格式正确的 json 响应(带有错误代码和所有内容)。这行得通。

但是:如果 PHP 觉得它有话要说,它在发送 json 响应后仍然会说。这会破坏客户端的 json 解析器。因此,不是 ajax 调用成功并显示诸如“找不到数据库文件”之类的错误消息,而是调用失败并出现 json 解析器错误,这没有帮助(因为它覆盖了原始的、保留的错误信息):

SyntaxError: JSON.parse: unexpected non-whitespace character 
after JSON data at line 1 column 120 of the JSON data

我可以使用 error_reporting(0) 抑制 PHP 的消息 - 但有更好的方法吗?代码(大纲)如下:

<?php
header('Content-type: application/json');
const RESP_OK = 0;
const RESP_EXCEPTION = 1;
try {
    // do the database stuff and build $response    
     $response['exitcode'] = RESP_OK;
} catch ( Exception $e ) {
    // put error info in the response
    $response['exitcode'] = RESP_EXCEPTION;
    $response['error'] = 'code: ' . $e->getCode() . ' (line ' .
       $e->getLine() . ') message: ' . $e->getMessage();

} finally {
    // always send back a response
    echo json_encode( $response );
    error_reporting(0);
    // also close the db here etc.
}
?>

【问题讨论】:

  • 我会附和 Maarten 的回答 - 防止 PHP 错误和警告的最佳方法是追踪导致它们的原因,而不是寻找绕过它们的方法。
  • 我同意。关键是,我已经在检查(所有)错误。这就像异常:一旦你使用 try/catch 来处理它们,你不希望发生默认的异常行为(例如,你希望你自己的错误消息在你自己的应用程序中正确显示)。我可以捕获异常,但没有 try/catch 用于 php 警告和通知(有吗?),所以即使我检查了所有结果并相应地继续,php 仍然会发出它们并破坏应用程序。
  • 返回的 JSON 数据是什么?那么我们来看看是什么产生了这个意想不到的空白字符呢? :)

标签: php json ajax error-handling


【解决方案1】:

错误报告是一种调试功能,因此它可以/应该/将在生产环境中关闭,而不是在您的开发环境中。

您应该以这样一种方式编写代码,以使您的代码涵盖所有内容。

分析每一个错误和警告,看看现在可以用“PHP 不觉得它有话要说”的方式来处理。

【讨论】:

  • 不过,这就是我正在做的事情:编写错误处理程序,并且在这里故意引入错误来测试它们: $db = new SQLite3( 'bad.db', SQLITE3_OPEN_READONLY ); - 这会在失败时引发异常,我可以捕捉到。但是: $result = $db->querySingle('SELECT [badcolumn] FROM [badtable] etc...'); - 这里,如果查询无效,会发生两件事:$result 为空,PHP 发出警告。我不想要那个警告,因为我正在检查结果(并且可以向 sqlite3 询问 lastErrorCode)。我是 php 新手,所以我需要听到这里可以抑制这种冗长:-)
  • 在这种情况下禁用警告。请参阅php.net/manual/en/function.error-reporting.php 或不通过 ini_set('display_errors',0) 显示它们请参阅stackoverflow.com/questions/9729000/…
  • 举个例子:用php挖EXIF数据。用户提供图像,应用程序无法控制 EXIF 数据的质量。读取该数据的代码会针对某些 EXIF 参数发出警告。我希望应用程序知道这些,以便应用程序可以通知用户......但是如果 E_WARNINGS 设置为 OFF,则不可能,如果设置为 ON,我会为 JSON 感到头疼。建议人们构建他们的应用程序,使语言的功能无法使用,这似乎是一件奇怪的事情。我注意到这篇文章是截至 19 年 12 月 2.5 岁的。有没有人设计并分享了一种解决方法来解决 php 踩 JSON 的废话?
  • 我最后做的是在上传图片后,在单独的 php 中运行检查 EXIF 参数并记录警告/错误,然后单独让用户知道他们是否需要发送修复图像或提议为他们修复 EXIF 数据。 Kludgy 和更多的编码,但它有效。
猜你喜欢
  • 2015-03-30
  • 2014-07-21
  • 2016-09-28
  • 2014-04-21
  • 1970-01-01
  • 1970-01-01
  • 2012-10-13
  • 2021-11-22
相关资源
最近更新 更多