是否有一种干净、简单的方法可以通过 json 响应 jquery/ajax 调用引发 php 异常。
问问题
46250 次
5 回答
62
你可以在 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:
通过返回 400(例如)标头来触发 $.ajax() 的处理程序:
header('HTTP/1.0 400 Bad error');
或者Status:
如果你在 FastCGI 上使用。请注意,error:
处理程序不会收到错误详细信息;要做到这一点,您必须重写$.ajax()
工作方式:)
于 2012-10-02T15:35:54.487 回答
8
Facebook 在他们的 PHP SDK 中做了一些事情,如果 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
然后,您可以在 JavaScript 中的 AJAX 调用中侦听密钥:
<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>
于 2012-10-02T15:38:51.193 回答
4
如果所有错误都应该以相同的方式处理(例如显示一个对话框)。你可以这样做:
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;
}
}
});
于 2012-10-02T15:42:43.257 回答
2
作为对先前答案的补充,您可以将异常处理程序设置为仅在所需脚本中使用,而不是在所有异常中重复相同的 json 编码代码。例如:
function ajaxExceptionHandler($e) {
echo json_encode(array(
'error' => array(
'code' => $e->getCode(),
'msg' => $e->getMessage())
));
}
然后,在您的 ajax 处理程序中,
set_exception_handler('ajaxExceptionHandler');
于 2016-09-19T12:21:53.640 回答
0
我使用这种方法将异常转换为 JSON:
<?php
namespace MyApp\Utility;
use Throwable;
trait JsonExceptionTrait
{
public function jsonException(Throwable $exception)
{
return json_encode([
'message' => $exception->getMessage(),
'code' => $exception->getCode(),
'file' => $exception->getFile(),
'line' => $exception->getLine(),
'trace' => $exception->getTrace()
]);
}
}
然后,只需在我的控制器中:
<?php
namespace MyApp\Controller;
use MyApp\Utility\JsonExceptionTrait;
class UserController extends AbstractController
{
use JsonExceptionTrait;
/**
* @param int $userId
* @return JsonResponse
*/
public function getAction(int $userId): JsonResponse
{
try {
$user = $this->userService->getUser($userId);
return new Response($user);
} catch (EntityNotFoundException $exception) {
return new Response(
$this->jsonException($exception),
JsonResponse::HTTP_NOT_FOUND
);
}
}
于 2019-05-05T10:17:01.507 回答