【问题标题】:Capture PHP error body within jQuery AJAX在 jQuery AJAX 中捕获 PHP 错误正文
【发布时间】:2019-03-02 16:12:12
【问题描述】:

我有一个 AJAX 构建,其功能类似于 CMD 行框。它允许我在禁用 MySQL 'IMPORT from FILE' 的服务器上分解和清理 ​​100,000+ 行 CSV 文件。每个客户的“擦洗”过程都不同。因此我构建了这个工具来允许我包含各种 PHP 脚本

它的工作原理很棒,除了 1 个区域的错误处理:PHP 错误级别

我想用 JS 记录错误,特别是 console.log()

然后考虑下面的 JS

$.ajax({
        type: 'POST', 
        dataType: 'text', //also tried json
        url: PHP_SCRIPT, //for sake of referance
        data: $.param(data), // param object values as POST values
        cache: false, 
        error: function(error) { 
            console.log("fubar:" +  JSON.stringify(error));

如果我在 PHP_SCRIPT 中导致错误(未使用 try/catch 处理并输出为 JSON),那么我会收到以下“模棱两可”的回复

stringify:{"readyState":4,"responseText":"","status":500,"statusText":"error"}

问题出在:responseText 为空。

PHP_SCRIPT 中真正发生的是这个错误:

Fatal error: Uncaught UnexpectedValueException: RecursiveDirectoryIterator::

我当然可以看看我是否运行了 PHP 脚本(我知道它为什么会发生,我的问题不是关于 RDI 错误)。考虑它也可能是其他错误:失败的包含,代码错误等。但是 JS 和 jQuery AJAX 似乎并没有“捕获”失败的 PHP 脚本的主体。

目标:我想“捕获”PHP 错误并使用 console.log()(甚至我的临时 CMD 行框)显示它们,这样我就不必切断 PHP_SCRIPT 和调试每行分开。我不明白为什么 error.responseText 不捕获输出。

理想情况下 - 上面的 PHP“致命错误”应该已被捕获为 TEXT 并在日志中输出。

注意:我对 DB 查询进行了 PDO 尝试/捕获处理,我可以在其中输出 success.error 对象并进行适当处理,捕获 PDO 异常并将其记录到控制台。唉,我看不到任何有用的方法来处理其他 PHP 错误(例如失败的包含或其他常见的 PHP 错误)。如果重要的话——我正在使用带有 nonce 和 die() 的 WordPress Admin AJAX,并且我的脚本运行良好,但是在开发新脚本期间捕获错误很烦人。

问题摘要:

  1. 有没有办法在 $.ajax 发生错误时捕获所有/任何未输出为 JSON 的 PHP 错误并在控制台记录它们?
  2. 有什么方法可以捕获 PHP 错误的“主体”并在 console.log 中记录它吗?

感谢您对此事的考虑

更新--- 添加视频澄清:http://www.screencast.com/t/ZyCeaMyAxBO

【问题讨论】:

  • 出于安全原因,这样做不是很好的做法。 PHP 错误应该只在开发模式下启用
  • @miken32 - 好的,似乎 set_exception_handler 可能是我去这里的方式。我可以尝试/捕获 PDO 错误并将它们发送到 success.data JS 级别并记录它们。如果我理解正确,您是在说 set_exception_handler 可以捕获 PHP 错误、死掉,然后将错误输出为 JSON,对吗? PS:我用这个视频更新了描述 => screencast.com/t/ZyCeaMyAxBO
  • 是的,编写一个异常处理函数,将异常详细信息输出为 JSON。 (而且没有人会观看视频来回答问题!)
  • 好的...感谢您的阅读然后...感谢。

标签: php


【解决方案1】:

您无法捕获所有错误情况,主要是因为您必须在 PHP 中编写错误处理程序,并且一些错误(如解析错误)导致脚本甚至无法编译,因此根本无法执行。

但是使用 set_error_handler() / set_exeception_handler() 您可能可以覆盖很大一部分...

【讨论】:

    【解决方案2】:

    这样的东西会捕获所有未捕获的异常并以 JSON 格式输出消息。

    set_exception_handler(function($e) {
        $msg = "Error: ";
        // maybe you want to treat some differently?
        if ($e instanceof \PDOException) {
            $msg = "Database error: ";
        }
        // you can access all properties of the exception to build a reply
        $msg .= $e->getMessage();
        header("Content-Type: text/json");
        echo json_encode(["message" => $msg]);
    });
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 2019-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    相关资源
    最近更新 更多