PHP异常处理后jQuery AJAX error回调未触发的解决疑问
问题分析与解决
先搞清楚一个关键点:jQuery的AJAX error 回调只会在**HTTP响应状态码是非2xx(比如400、500这类)**的时候触发。你的代码里,哪怕捕获到了异常,服务器还是返回了默认的200状态码,所以AJAX会直接走success回调,根本不会进入error。
怎么改?
- 在PHP的catch块里设置错误状态码
在输出错误信息之前,用http_response_code()给响应加一个错误状态码,比如400(表示请求参数或逻辑有误)或者500(服务器内部错误)。 - 不用重复抛异常,保持JSON输出
你不需要再throw一次异常,只要设置好状态码,再输出错误信息的JSON就行,这样AJAX会因为非2xx状态码触发error回调,同时还能拿到错误内容。
修改后的PHP代码:
try { $test = "testt"; if ($test == "test") { echo json_encode('success'); } else { throw new Exception('Condition wrong'); } } catch (Exception $e) { // 设置HTTP错误状态码,这里用400示例 http_response_code(400); echo json_encode($e->getMessage()); }
调整AJAX的error回调拿错误信息
因为你指定了dataType: "json",在error回调里可以通过xhr.responseJSON直接拿到解析好的错误信息,不用自己再解析:
var data = $('#form').serialize(); $.ajax({ url: "api.php", dataType: "json", data: data, type: "POST", success: function(result){ console.log(result); }, error: function (xhr, textStatus, errorThrown) { // 打印后端返回的错误信息 console.log(xhr.responseJSON); console.log(textStatus); console.log(errorThrown); } });
额外说明
要是不设置错误状态码,不管后端逻辑对不对,服务器都会返回200 OK,AJAX就会认为请求成功走success。你也可以在success里判断返回内容是不是错误信息,但这不符合HTTP的语义规范,还是用状态码区分成功失败更合理。
内容的提问来源于stack exchange,提问作者user979331
相关产品推荐
相关产品推荐

