Чистый способ бросить исключение php через jquery / ajax и json

Есть ли простой и простой способ выбросить php-исключения через jQuery-ответ jquery / ajax call.

Вы можете сделать что-то подобное в 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: обработчик $ .ajax (), возвращая заголовок 400 (например):

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

Или используйте Status: если вы находитесь в FastCGI. Обратите внимание, что обработчик error: обработчик не получает данные об ошибке; для выполнения этого вам нужно переопределить способ работы $.ajax() 🙂

Facebook что-то делает в своем SDK для PHP, где они генерируют исключение, если HTTP-запрос завершился неудачно по какой-либо причине. Вы можете воспользоваться этим подходом и просто вернуть данные об ошибках и исключениях, если выбрано исключение:

 <?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 в ваших вызовах AJAX в JavaScript:

 <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> 

Если все ошибки должны обрабатываться одинаково (показывая диалог, например). Вы можете сделать это следующим образом:

PHP End:

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

jQuery End:

 $(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; } } }); 

В дополнение к предыдущим ответам вместо повторения одного и того же кода для json-кодирования во всех ваших исключениях вы можете установить обработчик исключений, который будет использоваться только в необходимых сценариях. Например:

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

Затем, в вашем обработчике ajax,

 set_exception_handler('ajaxExceptionHandler');