php 7.1 起支持单个 catch 块捕获多种异常类型,用 | 分隔无继承关系的已导入类,如 catch (invalidargumentexception | runtimeexception $e);禁止使用带反斜杠的完整命名空间或存在继承关系的类。

PHP 7.1 起支持在单个 catch 块中捕获多种异常类型,用竖线(|)分隔类名,前提是这些异常类彼此没有继承关系,且已通过 use 正确导入。
语法写法要规范
直接在 catch 括号内列出多个异常类,用 | 连接,异常变量名写在最后:
-
catch (InvalidArgumentException | RuntimeException $e)✅ 正确 -
catch (Exception | LogicException $e)❌ 错误——后者是前者的子类,存在继承关系,会触发致命错误 -
catch (\InvalidArgumentException | \RuntimeException $e)❌ 错误——PHP 7.1 不支持在catch中使用带反斜杠的完整命名空间写法
命名空间必须提前导入
若异常类来自深层命名空间(如 Symfony\Component\HttpKernel\Exception\NotFoundHttpException),需先 use,不能省略:
- 逐个导入:
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; - 批量导入(PHP 7.1+ 支持):
use Symfony\Component\HttpKernel\Exception\{NotFoundHttpException, AccessDeniedHttpException};
适用场景与注意事项
多异常捕获适合对不同异常执行相同处理逻辑的情况,比如统一记录日志或返回错误响应:
- 避免重复代码:不用为
FileNotFoundException和DatabaseException各写一个catch块再调同一函数 - 匹配不依赖顺序:PHP 按实际抛出的异常类型匹配,和你在
catch中书写的先后无关 - 仍需保留通用兜底:建议在多类型
catch后加一个catch (Exception $e)处理未覆盖的异常
完整示例结构
一个典型用法包含 try、多类型 catch 和可选的 finally:
try {
$user = UserRepository::find($id);
$profile = $user->loadProfile();
} catch (NotFoundException | PermissionDeniedException $e) {
http_response_code(404);
echo '资源不可用';
} catch (Exception $e) {
error_log('未预期异常: ' . $e->getMessage());
throw new InternalServerErrorException();
} finally {
// 清理资源,无论是否异常都会执行
closeConnection();
}php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











