Есть ли простой и простой способ выбросить 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');