Я использую JQuery для вызова функции PHP, которая возвращает строку JSON при успешном выполнении или выдает некоторые исключения. В настоящее время я jQuery.parseJSON() в ответ, и если он не работает, я предполагаю, что ответ содержит строку исключения.
$ .ajax ({
тип: «POST»,
url: "something.php",
success: function (response) {
пытаться {
var json = jQuery.parseJSON (ответ);
}
catch (e) {
оповещение (ответ);
return -1;
}
// ... делай что-нибудь с json
}
Может ли кто-нибудь предложить более элегантный способ поймать исключение?
Большое спасибо, Итамар
Ну, у вас может быть глобальный обработчик исключений на PHP, который будет называть json_encode на нем, а затем повторять его.
<?php function handleException( $e ) { echo json_encode( $e ); } set_exception_handler( 'handleException' ); ?>
Затем вы можете проверить, если, скажем, json.Exception != undefined .
$.ajax({ type: "POST", url: "something.php", success: function(response){ var json = jQuery.parseJSON( response ); if( json.Exception != undefined ) { //handle exception... } // ... do stuff with json }
Поймайте исключение в своем PHP-скрипте – используя блок try .... catch и когда возникает исключение, попросите сценарий вывести объект JSON с сообщением об ошибке:
try { // do what you have to do } catch (Exception $e) { echo json_encode("error" => "Exception occurred: ".$e->getMessage()); }
вы затем будете искать сообщение об ошибке в сценарии jQuery и, возможно, вывести его.
Другой вариант – отправить заголовок 500 internal server error когда PHP встретит исключение:
try { // do what you have to do } catch (Exception $e) { header("HTTP/1.1 500 Internal Server Error"); echo "Exception occurred: ".$e->getMessage(); // the response body // to parse in Ajax die(); }
ваш объект Ajax затем вызовет функцию обратного вызова ошибки, и вы будете делать свою обработку ошибок там.
Выведите исключение на конец PHP и выведите сообщение об ошибке в формате JSON:
echo json_encode(array( 'error' => $e->getMessage(), ));
echo json_encode(array( 'error' => $e->getMessage(), ));