Я использую 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(), ));