2012-04-20 8 views
4

予想されるエラーは、私が予想していた、またはコードで自分自身で育てたサーバーからのものです。たとえば、ユーザーが十分な特権を持たないアクションを実行しようとすると、エラーを説明するメッセージとともにPermissionError(カスタムException)を発行します。AJAXで予想されるエラーを処理する方法(ユーザーに公開する方法を含む)

私は、AJAXの状況で予想されるエラーを処理するための良い方法を探していました。唯一の要件は、エラーメッセージをユーザーに表示できるようにすることです。私は、ユーザーを何が起こっているかのループにとどめたいからです。

私の現在のアプローチは、JSONオブジェクトにエラーメッセージをパッケージ化し、クライアントエンド私はわからないよ心の中で別のアプローチを、持っている

var ajaxResponse = $.ajax({ 
    ....   
}); 

ajaxResponse.done(function(jsonObj) { 
    if (jsonObj.success) { 
     /* no error, do something */  
    } 
    else { 
     /* expected error returned, display jsonObj.error to user */ 
    } 
}); 

ajaxResponse.fail(function(jqXHR, textStatus, errorThrown) { 
    /* unexpected error returned */ 
}); 

に戻ってそれを送信しています。基本的には、JSONオブジェクトに予想されるエラーのメッセージをパッケージ化するのではなく、私のdjangoコードでHttpResponse(content="no sufficient privilege", status=403)を返します。

ajaxResponse.done(function(response_data) { 
    /* no error, do something */ 
}); 

ajaxResponse.fail(function(jqXHR, textStatus, errorThrown) { 
    /* both expected and unexpected error would end up here. 
    * It's an expected error when error code is 403 and 
    * jqXHR.responseText would give me the error message to 
    * display to the user. 
    */ 
}); 

私は、2番目のアプローチがすべてのエラーを1つの場所にグループ化するのが好きです。しかし、私は、httpステータスコードをこのように使うべきではないと感じています。とにかく、どちらが正しい道かを知りたい。もしどちらでもなければ、あなたがすることを分かち合ってください。

+0

「しかし、その後、私はHTTPステータスコードがこの方法を使用すべきではない気がする」 - –

+0

@AnthonyGrist - 私はT.Jと同じ意見を共有しています。クラウダー。ここで彼は[別のSOの投稿](http://stackoverflow.com/a/6701385/338961)で言わなければならなかったものです。 – tamakisquare

答えて

0

私は個人的に常にアプローチ1を使用します。これは、特にHTTPエラーコードよりもエラー条件が多いためです。また、2番目の方法を使用すると、jsコードが予期しないエラーと予期しないエラーを区別できない場合があります。

+0

私は、状態コード403を使用して予期しないエラーと予期しないエラーを区別できると思います。私が意図的にそれを引き起こさない限り、403レスポンスが送信されるとは思わないでください。 – tamakisquare

1

jqXHRオブジェクトには、失敗した応答に関するすべての情報が含まれています。まず、私はあなたが要求を行う方法を簡素化することができます:

$.ajax({ 
     url: '/the/posting/url', 
     type: 'POST', 
     data: { param: value, param_two: value_two}, 
     success: function(){ 
      alert('Everything went as is supposed to be.'); 
     }, 
     error: function(jqXHR, t, e){ 
      console.log(jqXHR.responseText); 
     } 
    }) 

ので、この方法は、あなたがリクエストが良いかどうあなたが何をしたいのか管理します。そのプロパティが(何かがうまくいかないときは、トレースを置く方法に応じて)エラーが詳細にわかりますのでです

console.log(jqXHR.responseText); 

:次に、あなたは私のようなものを書いて参照してください。 Firebug(Firefox)または開発者用ツール(ChromeとSafari)のコンソールで読むことができます。

django(私が想定している)がそのままエラーを送信し、エラーが発生したため、何かが間違っていることを知るためにjsonにオブジェクトをシリアル化する必要はありません。だから、jQueryが何か間違っていると分かっている場合、ajaxオブジェクトのerrorプロパティがトリガされ、それがコンソールに表示されます。

$.ajaxSetup({ 

    error: function(xhr){ 
     /* Do something with xhr.responseText */ 
     window.status='Your error message goes here'; 
    } 

}); 
+3

FYI。非推奨通知:jqXHR.success()、jqXHR.error()、およびjqXHR.complete()コールバックは、jQuery 1.8では廃止予定です。最終的な削除のためにコードを準備するには、代わりにjqXHR.done()、jqXHR.fail()およびjqXHR.always()を使用してください。 – tamakisquare

2

は、このようなグローバルな構成を持っています何故なの?要求を処理する際にエラーが発生したことを示しているのは、**まさに**どのステータスコードを使用すべきかということです。
+0

それは私が探している答えではありません。どのようにエラーメッセージを表示するかは、私の関心事ではありません。私は、予想されるサーバーエラーをユーザーに表示するための構造化された一貫性のある方法を探しています。 – tamakisquare

+0

@ahmoo:どのように私の好みです。 「構造」は、アプリケーション全体の1か所でエラー処理を設定することです。したがって、 'ajaxSetup()'の使用。 –

関連する問題