You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Symfony 6自定义错误控制器中如何获取500错误码

解决Symfony自定义错误控制器中500异常code返回0的问题

问题场景

自定义Symfony错误控制器后:

  • 404错误时,exception->getCode()能正常返回404;
  • 500错误(如第三方请求超时)时,exception->getCode()返回0,但getMessage()能拿到正确的错误信息;
  • 关闭error_controller配置后,系统能正常触发500异常提示。

核心需求:在自定义错误控制器中获取到500的HTTP状态码。

问题原因

  • 404错误对应的是Symfony内置的NotFoundHttpException,该异常本身的code就是404,所以直接调用getCode()能拿到正确值;
  • 500错误的原始异常(如请求超时异常)本身的code为0,Symfony默认异常处理会将这类非HTTP标准异常映射为HTTP 500状态码,但自定义控制器直接接收的是原始异常实例,而非Symfony标准化后的异常对象,因此无法通过getCode()获取到500状态码。

解决方案

修改自定义错误控制器,接收Symfony提供的FlattenException对象(该对象封装了HTTP状态码、异常链等标准化信息),通过它获取正确的HTTP状态码。

修改后的控制器代码

use Symfony\Component\HttpKernel\Exception\FlattenException;
use Symfony\Component\HttpFoundation\Response;

#[AsController]
class ErrorController
{
    public function show(FlattenException $exception): Response
    {
        // 获取标准化后的HTTP状态码(404/500等)
        $statusCode = $exception->getStatusCode();
        // 获取原始异常实例(可选)
        $originalException = $exception->getPrevious();
        // 获取错误消息(优先取原始异常的消息)
        $errorMessage = $originalException?->getMessage() ?? $exception->getMessage();

        var_dump($statusCode, $errorMessage);
        die;
    }
}

关键说明

  1. FlattenException是Symfony专门用于标准化异常处理的对象,它会根据原始异常的类型自动映射对应的HTTP状态码;
  2. 若需要处理原始异常的细节,可以通过$exception->getPrevious()获取原始异常实例;
  3. 保持原有error_controller配置不变即可生效:
framework:
    secret: '%env(APP_SECRET)%'
    #csrf_protection: true
    http_method_override: false
    error_controller: App\Controller\ErrorController::show

内容的提问来源于stack exchange,提问作者John V

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 05:28:28