4

予想されるエラーは、サーバーからのエラーであり、私が予想したか、コードで自分自身が発生させたものです。たとえば、ユーザーが十分な権限を持っていないアクションを実行しようとすると、エラーを説明するメッセージとともにPermissionError(カスタム) を発生させます。Exception

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). クライアント側の jQuery は次のように変更されます。

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 ステータス コードをこのように使用するべきではないと感じています。とにかく、どちらが正しい方法なのか知りたいです。どちらでもない場合は、何をするかを共有してください。

4

3 に答える 3

3

Have a global configuration like this -

$.ajaxSetup({

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

});
于 2012-04-20T21:39:45.617 に答える
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オブジェクトのエラープロパティがトリガーされ、それだけで、コンソールで読み取ることができます。

于 2012-04-20T21:32:32.527 に答える
0

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

于 2012-04-20T21:29:34.713 に答える