通过jquery / ajax和json清除抛出phpexception的方法

是否有一种干净,简单的方法通过json响应jquery / ajax调用抛出phpexception。

你可以在PHP中做这样的事情(假设这是通过AJAX调用的):

 '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); } }); 

您还可以通过返回400(例如)标头来触发error: $ .ajax()的处理程序:

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

或使用Status:如果您使用的是FastCGI。 请注意, error:处理程序不会收到错误详细信息; 要实现你必须覆盖$.ajax()工作方式:)

Facebook在他们的PHP SDK中做了一些事情,如果HTTP请求因任何原因失败,他们会抛出exception。 您可以采用这种方法,只是在抛出exception时返回错误和exception详细信息:

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

然后,您可以在JavaScript中监听AJAX调用中的error键:

  

如果所有错误都应该以相同的方式处理(例如显示一个对话框)。 你可以这样做:

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

作为以前答案的补充,您可以将exception处理程序设置为仅在所需的脚本中使用,而不是在所有exception中为json编码重复相同的代码。 例如:

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

然后,在你的ajax处理程序中,

 set_exception_handler('ajaxExceptionHandler');