2012-02-29 9 views
3

サーバー側(PHP)でスローされたエラーは、ハッシュでキャプチャされ、AJAX経由でクライアント側(javascript)に返されます。このようにして、エラーのJSONは実際にAJAXの成功イベントに配信されます。Ajaxの成功イベントから新しいエラーが発生する可能性がありますか?

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

データ[「エラー」]は定義されていない場合、私は基本的にチェックし、そうでない場合、私は理論的には全体のAJAXをカプセル化し、私のtry/catchブロックでキャッチされるだろう、新しいエラーをスローします。

... 
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

あなたはのtry catchブロックでは、実際にあなたの成功とエラーの機能をカプセル化する必要があるが、その中にエラーをキャッチできるようにします。 1つの解決策は、$ .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

0

問題は、jQueryの自体がtry/catchブロックと.ajax()ルーチンの一部をカプセル化することであり、 。だから私の推測では、あなたのエラーはそれらのブロックの一つに捕まってしまうということです。

あなたはjQuery.error('error message!');

リファレンスを使用して、それを回避することができます:jQuery.error

+0

私はそれを試しましたが、エラーはまだ私のtry/catchで捕捉されていない、全体の.ajax()をカプセル化します。 – kaspnord

関連する問題