Hyperf异常处理器需显式注册于config/autoload/exceptions.php,按二维数组['handler' => ['http' => [...]]]结构配置,顺序决定匹配优先级;Handler须继承ExceptionHandler并实现isValid(需同时判断Exception与Error)和handle(手动设状态码、调用stopPropagation);非HTTP场景如队列需在isValid中排除。

必须注册到 config/autoload/exceptions.php
仅定义 Handler 类不生效。要在 对应 server 类型 下注册,比如 HTTP 请求走 'http' 分组:
- 路径:
config/autoload/exceptions.php - 结构必须是二维数组:
['handler' => ['http' => [...]]] - 数组顺序 = 匹配优先级:靠前的先调
isValid(),返回true就执行handle()并默认继续传递,除非你主动stopPropagation()
Handler 必须继承 ExceptionHandler 并实现 isValid + handle
不能只写一个空类。核心逻辑在两个方法:
-
isValid(Throwable $throwable): bool:严格判断类型,例如return $throwable instanceof \InvalidArgumentException;,别写return true;(否则吞掉所有异常,包括 404) -
handle(Throwable $throwable, ResponseInterface $response):构造响应并调用$this->stopPropagation()阻断传播;HTTP 状态码要手动设($response->withStatus(500)),业务 code 放 JSON body 里
注意 PHP Error(如 ParseError、TypeError)需额外兼容
PHP 7+ 的 Error 类型不是 Exception 子类,但也是 Throwable。若想捕获语法错误、类型不匹配等,isValid() 中需同时检查:
$throwable instanceof \Exception-
$throwable instanceof \Error(或更宽泛地:!$throwable instanceof \Exception && $throwable instanceof \Throwable)
否则这些错误会绕过所有 Handler,直击 Worker 进程退出。
立即学习“PHP免费学习笔记(深入)”;
避免全局兜底 Handler 意外拦截非 HTTP 场景
异步队列、定时任务、自定义进程等非 HTTP 上下文,不应走 Web 层异常处理流程:
- 在
shouldReport()或isValid()中排除队列异常:if ($throwable instanceof \Hyperf\AsyncQueue\Exception\JobException) return false; - 确保异常处理器只对
'http'server 生效,其他 server(如'queue')应单独配置或留空



















