簡體   English   中英

jquery + php:從ajax捕獲php錯誤

[英]jquery + php: catching php error from ajax

我使用的是jquery的$.post ,服務器腳本有時會引發php錯誤。 我有什么想法可以捕獲該錯誤並將其報告回客戶端腳本? 我已經嘗試過set_error_handler()但遺憾的是由於某種原因它不能解決致命的php錯誤,所以當出現錯誤時,根本不會發生任何事情。 謝謝

執行此操作的最佳方法是讓腳本始終返回json並獲得success:true/false ,然后您將永遠不需要錯誤處理程序。

我知道你不能總是這樣做,所以根據你可以在這里找到的文檔:

var jqxhr = $.post("example.php", function() {
  alert("success");
})
.success(function() { alert("second success"); })
.error(function() { alert("error"); })
.complete(function() { alert("complete"); });

// perform other work here ...

// Set another completion function for the request above
jqxhr.complete(function(){ alert("second complete"); });

更新

使用xml:

<root>
    <success>true/false</success>
    <response>
        <response_node_1>Foo</response_node_1>
        <response_node_2>Bar</response_node_2>
    </response>
</root>

您無法在同一PHP腳本中跟蹤致命錯誤。 在你寫的時候, set_error_handler不會對它們起作用。 您無能為力,但查找HTTP響應代碼(500 - 內部服務器錯誤)。

你可以做的是讓你的代碼更加安全/徹底/健壯,所以不會出現致命的錯誤。 通過分析您的php錯誤日志來執行此操作,這些錯誤會出現致命錯誤,並查看相關代碼出現的原因以及如何通過正確的錯誤檢查來阻止這些錯誤。

您可以使用類似的設置來設置全局錯誤處理

$.ajaxSetup({
    error:function(x,e){
        if(x.status==0){
        alert('You are offline!!\n Please Check Your Network.');
        }else if(x.status==404){
        alert('Requested URL not found.');
        }else if(x.status==500){
        alert('Internel Server Error.');
        }else if(e=='parsererror'){
        alert('Error.\nParsing JSON Request failed.');
        }else if(e=='timeout'){
        alert('Request Time out.');
        }else {
        alert('Unknow Error.\n'+x.responseText);
        }
    }
});

或者在json響應中查看錯誤處理程序,並決定在使用某些變量傳遞時要執行的操作。

您不希望腳本在生產環境中輸出錯誤信息,因此您應該在那里禁用錯誤報告。

你在說什么樣的錯誤? 在您的開發環境中,啟用所有錯誤並對其進行跟蹤,並進行防御性編程以防止錯誤發生。 有很多方法可以做到這一點,具體取決於錯誤的來源。

最后,如果你可以捕獲錯誤,你可以設置某種錯誤標志( $error = true ),並在最終輸出上執行如下操作:

echo '{"success": $error}';
if (!$error)
{
    echo $the_requested_data;
}

然后,您可以讓jQuery讀取成功變量。

根據php配置, 有時會發生致命錯誤(感謝PHP)會導致HTTP 200響應,jQuery不會將其作為錯誤捕獲,但會被視為一個很好的響應。 所以,正如某人已經指出的那樣,你應該避免致命的錯誤(仔細檢查你的代碼容易出錯的部分,捕獲異常,檢查數組索引,在使用之前聲明變量等等)。

我找到了我的解決方案:因為我期待返回一個xml - 我只需要檢查響應的內容類型,當php引發錯誤時我得到text / html而不是text / xml :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM