2012-02-29 32 views
3

在服務器端(PHP)拋出的任何錯誤都會在哈希中捕獲並通過AJAX發送回客戶端(javascript)。通過這種方式,錯誤的JSON實際上被傳遞給AJAX成功事件。可能從Ajax成功事件中拋出新的錯誤?

... 
catch ($e) { 
    echo (array("error" => $e->getMessage())); 
} 

我基本上是檢查數據[「錯誤」]是不確定的,如果沒有,我想拋出一個新的錯誤,將理論上我try/catch塊是將整個AJAX被抓住。

... 
success : function(data) { 
    if (typeof(data["error"]) != "undefined") { 
     throw new Error(data["error"]); 
    } 

    handleGoodData(data); 
} 

它一直告訴我錯誤未被捕獲(通過Chrome控制檯)。如果已經定義,我已經檢查並且數據[「error」]返回一個字符串。

即使在最簡單的形式,只需在成功事件拋出一個新的錯誤似乎不工作,要麼:

success : function(data) { 
    throw new Error("error message!"); 
} 

回答

2

你有實際封裝你的成功和錯誤功能嘗試catch塊,以便能夠在其中發現錯誤。一種解決方案是在$ .ajax調用之間創建一個圖層,以便它首先通過自己的函數。例如:

myajax: function(settings) { 

      // override provided success callback with try catch 
      if (settings.success){ 
       var successFunc = settings.success; 
       settings.success = function(){ 
        try{ 
         successFunc.call(arguments); 
        } 
        catch(error){ 
         console.log("An unhandled error occurred in ajax success callback: " + error); 
        } 
       }; 
      } 

      // override provided error callback with try catch 
      if (settings.error) { 
       var errorFunc = settings.error; 
       settings.error = function() { 
        try{ 
         errorFunc.call(arguments); 
        } 
        catch(error){ 
         console.log("An unhandled error occurred in ajax error callback: " + error); 
        } 
       }; 
      } 
      // else create our own basic error callback 
      else { 
       settings.error = function(jqXHR, textStatus, errorThrown) { 
        console.log("An unhandled error occurred during an AJAX call: " + errorThrown); 
       }; 
      } 


      $.ajax(settings); 
     } 
    }; 
+0

謝謝,通過try/catch工作處理另一個函數中的AJAX成功數據。 – kaspnord 2012-03-05 15:47:27

0

的問題是,jQuery的本身封裝.ajax()程序的部分與try/catch塊。所以我的猜測是你的錯誤會被其中一個塊捕獲。

您可以通過使用jQuery.error('error message!');

參考變通辦法:jQuery.error

+0

我試過了,錯誤仍然沒有被捕獲在我的try/catch封裝整個.ajax()。 – kaspnord 2012-02-29 16:26:29