32

JSON応答jquery/ajax呼び出しを介してphp例外をスローするクリーンで簡単な方法はありますか.

4

5 に答える 5

62

PHP で次のようなことができます (これが AJAX 経由で呼び出されると仮定します)。

<?php

try {
    if (some_bad_condition) {
        throw new Exception('Test error', 123);
    }
    echo json_encode(array(
        'result' => 'vanilla!',
    ));
} catch (Exception $e) {
    echo json_encode(array(
        'error' => array(
            'msg' => $e->getMessage(),
            'code' => $e->getCode(),
        ),
    ));
}

JavaScript の場合:

$.ajax({
    // ...
    success: function(data) {
        if (data.error) {
            // handle the error
            throw data.error.msg;
        }
        alert(data.result);
    }
});

error:400 (たとえば) ヘッダーを返すことで、 $.ajax()のハンドラーをトリガーすることもできます。

header('HTTP/1.0 400 Bad error');

またはStatus:、FastCGI を使用している場合に使用します。error:ハンドラーはエラーの詳細を受信しないことに注意してください。それを達成するには、どのように機能するかをオーバーライドする必要があります$.ajax():)

于 2012-10-02T15:35:54.487 に答える
8

Facebook は、何らかの理由で HTTP 要求が失敗した場合に例外をスローする PHP SDK で何かを行います。このアプローチを取ることができ、例外がスローされた場合にエラーと例外の詳細を返すだけです。

<?php

header('Content-Type: application/json');

try {
    // something; result successful
    echo json_encode(array(
        'results' => $results
    ));
}
catch (Exception $e) {
    echo json_encode(array(
        'error' => array(
            'code' => $e->getCode(),
            'message' => $e->getMessage()
        )
    ));
}

error次に、JavaScript の AJAX 呼び出しでキーをリッスンするだけです。

<script>
    $.getJSON('http://example.com/some_endpoint.php', function(response) {
        if (response.error) {
            // an error occurred
        }
        else {
            $.each(response.results, function(i, result) {
                // do something with each result
            });
        }
    });
</script>
于 2012-10-02T15:38:51.193 に答える
4

すべてのエラーを同じ方法で処理する必要がある場合 (たとえば、ダイアログを表示する)。次の方法で実行できます。

PHP終了:

public function throwJsonException($msg) {
    echo json_encode(array('error'=> true, 'msg' => $msg));
}

throwJsonException('login invalid!');

jQuery 終了:

$(document).ajaxSuccess(function(evt, request, settings){
    var data=request.responseText;
    if (data.length>0) {
        var resp=$.parseJSON(data);
        if (resp.error)
        {
            showDialog(resp.msg);
            return;
        }                   
    }    
});
于 2012-10-02T15:42:43.257 に答える
2

前の回答を補完するものとして、すべての例外で json エンコードの同じコードを繰り返す代わりに、必要なスクリプトでのみ使用されるように例外ハンドラーを設定できます。例えば:

function ajaxExceptionHandler($e) {
    echo json_encode(array(
        'error' => array(
        'code' => $e->getCode(),
        'msg' => $e->getMessage())
    ));
}

次に、ajax ハンドラーで、

set_exception_handler('ajaxExceptionHandler');
于 2016-09-19T12:21:53.640 に答える