【问题标题】:Proper mechanism for sending PHP errors to the client将 PHP 错误发送到客户端的正确机制
【发布时间】:2011-02-05 07:01:34
【问题描述】:

您好,
我试图找到一种将捕获的错误或业务逻辑异常发送到 Ajax-PHP 系统中的客户端的正确方法。就我而言,浏览器需要根据请求是否成功做出不同的反应。然而,在我发现的所有示例中,在这两种情况下都只向浏览器报告了一个简单的字符串。例如:

if (something worked)
    echo "Success!";
else
    echo "ERROR: that failed";

因此,当浏览器返回 Ajax 响应时,知道是否发生错误的唯一方法是解析字符串(也许是寻找“错误”)。这看起来很笨重。

是否有更好/正确的方法来发回 Ajax 响应并通知浏览器出现错误?
谢谢。

【问题讨论】:

    标签: php ajax error-handling


    【解决方案1】:

    您可以发回 HTTP 状态代码 500 (Internal server error) ,然后在正文中包含错误消息。然后,您的客户端 AJAX 库应将其作为错误处理(并调用适当的回调等),而无需在响应中查找字符串。

    【讨论】:

    • +1 例如,jQuery 在其 Ajax 方法中为成功和失败的请求接受不同的回调函数。
    【解决方案2】:

    我通常会发回这样的 JSON 响应:

    $response = array('status' => 'error', 'message' => 'an unknown error occured');
    
    if( some_process() ) {
        $response['status'] = 'success';
        $response['message'] = 'Everything went better than expected.';
    } else {
        $response['message'] = "Couldn't reticulate splines.";
    }
    
    die( json_encode($response) );
    

    因此,我可以在我的 JavaScript 中检查response.status 的状态,并查找“成功”或“错误”的值并适当地显示response.message

    【讨论】:

    • 很高兴知道我只是忽略了一个明确的机制。我期待更像是 http 状态代码的东西成为明确的答案。然而,向 json 响应添加状态和消息似乎是一种流行的选择。而且由于我的数据库响应无论如何都会被 json 编码,我会走这条路。 TY
    【解决方案3】:

    向用户显示正在发生的事情和已经发生的事情的状态非常重要。

    如果你想构建你的 ajax 响应,你应该查看 json 格式。

    if (something worked)
        echo '{ "error": 0 }';
    else
        echo '{ "error": 1 }';
    

    一旦你踏入 json 世界,你将能够发送更多结构化的输出。例如:

    if (something worked)
        echo '{ "error": 0 }';
    else
        echo '{ "error": 1, "code": 889, "desc": "Something bad happened" }';
    

    当您在 javascript 中收到此输出时,您可以将其转换为对象并根据不同的键执行操作。

    库 json2.js 将帮助您将输出转换为对象

    【讨论】:

      【解决方案4】:

      发送适当的 http 标头应该可以解决问题,并告诉您的 ajax 脚本执行正确的回调。我知道的每个 javascript 框架都有一个针对其 XHR 请求的成功和错误回调。

      header('HTTP/1.1 500 Internal Server Error');

      【讨论】:

        【解决方案5】:

        您可以发回包含自定义错误代码和错误消息的 JSON 对象,然后您可以处理或直接向用户显示:

        {
             "response": 10,
             "message": "The database didn't work or something"
        }
        

        它也适用于成功:

        {
             "response": 1,
             "message": "It worked! Yippee!"
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-06-30
          • 1970-01-01
          • 2012-10-18
          • 2015-08-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多