PHP推荐用异常而非传统错误处理,因其将错误变为可编程、可分类、可追踪的对象,实现错误与业务逻辑分离,支持分层捕获、栈传播、现代特性集成及统一可观测性治理。

PHP 推荐用异常(Exception)而非传统错误处理,核心在于它把“出错”变成可编程、可分类、可追踪的对象,而不是散落在各处的警告或静默失败。
异常让错误逻辑和业务逻辑真正分离
函数只管做正事,比如打开文件、查询数据库、解析 JSON;出错了,就 throw 一个异常。谁调用它,谁决定怎么应对——是重试、回滚、提示用户,还是记录日志后继续执行。不用在每个函数里塞一堆 if ($result === false) 和 error_get_last()。
异常支持分层捕获与精准响应
你可以定义不同类型的异常类,比如 DatabaseConnectionException、InvalidInputException、RateLimitExceededException。然后按需捕获:
- 捕获具体类型:
catch (DatabaseConnectionException $e)处理连接问题; - 再兜底通用异常:
catch (Exception $e)防止漏掉其他情况; - 不用再靠错误码或字符串匹配判断,类型即语义。
异常天然支持调用栈传播
底层函数抛出异常,可以一路向上冒泡,直到被合适层级捕获。比如 DAO 层抛出 RecordNotFoundException,Service 层选择转换为 ApiResourceNotFoundException 并返回 404,Controller 层统一格式化响应——整个链路清晰可控。而传统错误(如 E_WARNING)无法自动跨函数传递,必须手动检查返回值或全局变量。
异常配合现代 PHP 特性更可靠
PDO 默认启用 PDO::ERRMODE_EXCEPTION(PHP 8.0+),文件操作可通过 file_get_contents() + throw 封装,JSON 解析可用 json_decode($json, flags: JSON_THROW_ON_ERROR)。这些机制默认产出异常,强行用 @ 抑制或 error_get_last() 补救,反而绕过语言设计意图,增加维护成本。
异常便于统一治理与可观测性
设置全局处理器 set_exception_handler(),就能集中记录日志、上报监控、脱敏敏感信息;结合 finally 块,确保资源释放(如关闭句柄、提交/回滚事务)不被遗漏;异常对象自带 getFile()、getLine()、getTraceAsString(),调试时一眼定位问题源头。
基本上就这些。



















