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; } }
关键说明
FlattenException是Symfony专门用于标准化异常处理的对象,它会根据原始异常的类型自动映射对应的HTTP状态码;- 若需要处理原始异常的细节,可以通过
$exception->getPrevious()获取原始异常实例; - 保持原有
error_controller配置不变即可生效:
framework: secret: '%env(APP_SECRET)%' #csrf_protection: true http_method_override: false error_controller: App\Controller\ErrorController::show
内容的提问来源于stack exchange,提问作者John V
相关产品推荐
相关产品推荐

