抛出异常,但 json 响应获得状态 SUCCESS

Throw exception, but json response get status SUCCESS

我在 Controller 中有这部分代码,但是当我执行此操作并且 IF 工作正常并且错误消息出现在控制台日志中时。

但看起来 'success' 的状态为 true。而且不应该

Try {
    if ($last['date']) {
        if ($last['date']->format('d-m-Y') == $par['date']) {
                throw new \Exception('error', 500);
            }
    }

    return new JsonResponse([
        'success' => true,
        'data'    => $content,
        'message' => 'success'
    ]);
} catch (\Exception $exception) {

    return new JsonResponse([
        'success' => false,
        'code'    => $exception->getCode(),
        'message' => $exception->getMessage(),
    ]);
}

JQuery

$.ajax({
    type: "POST",
    url: "/app/url",
    data: TableData,
    dataType: "json",
    success: function(response){
        console.log(response.message);
        $('#message').html('<p class="alert alert-success">' + response.message + '</p>');
    },
    error: function (response) {
        console.log(response.message);
        $('#message').html('<p class="alert alert-danger">' + response.message + '</p>');
    }
});

无论 JSON 内容如何,​​您的 AJAX 代码每次都会收到 success 的响应,因为您总是发送 200 响应(是成功)。要告诉 AJAX 将响应作为错误处理(并转到 error 方法而不是 AJAX 响应处理程序中的 success 方法),您需要发送一个错误响应中的代码,即 400,如下所示:

return new JsonResponse([
        'success' => false,
        'code'    => 400,
        'message' => $exception->getMessage(),
    ], 400);

因此,如果您要抛出自定义 Exception,则需要根据它们的真实 HTTP 含义为每个设置 code 属性。

现在,AJAX 中的 successerror 处理程序具有不同的参数。在success中,第一个参数是data,只是从服务器返回的数据。另一方面,在 error 中,第一个参数是一个 jqXHR 对象。要访问此对象中的数据,您需要一些不同的参数,但现在您需要的是 JSON,因为您有 jqXHR.responseJSON。所以,现在您的错误消息将在 response.responseJSON.message 中,而不是 response.message 中。查看更多相关信息 here.