uncaught error 是 php 7+ 的致命错误对象,不继承 exception 而直接实现 throwable 接口,因此 catch (exception $e) 无法捕获,需用 catch (error $e) 或 catch (throwable $e) 才能捕获。

Uncaught Error 是 PHP 7+ 的致命错误对象,不是 Exception
PHP 7 起,ParseError、TypeError、DivisionByZeroError 等原本直接终止脚本的致命错误,现在会以 Error 类实例形式抛出,但它们**不继承 Exception**,而是直接实现 Throwable 接口。所以 catch (Exception $e) 根本捕获不到 Uncaught Error,只会看到 “Fatal error: Uncaught …” 并中止执行。
常见触发场景包括:
-
echo $undefinedVar;→ 不报Error,只触发E_NOTICE(非 Throwable,无法用 try/catch 捕获) -
new NonExistentClass();→ 抛出Error(ClassNotFoundException在 PHP 7.2+ 是Error子类) -
1 / 0;→ PHP 8+ 抛出DivisionByZeroError;PHP 7.x 则是Warning+ 返回INF,不抛Error -
json_decode('{', true);→ PHP 7.3+ 抛出JsonException(它继承Exception,不是Error)
Exception 必须手动 throw,Error 多数由引擎自动抛出
Exception 是开发者控制流工具:你得写 throw new Exception('xxx'),或依赖某些扩展(如 PDO、JSON)在特定条件下主动抛出。而 Error 几乎全是 PHP 引擎在解析、编译、运行阶段发现不可恢复问题时自动生成的——比如调用不存在的方法、类型不匹配(启用严格模式)、内存耗尽等。
关键区别在于可预测性:
-
try { foo(); } catch (Exception $e) { }—— 完全捕获不到foo()未定义引发的Fatal error -
try { foo(); } catch (Error $e) { echo $e->getMessage(); }—— PHP 7+ 可捕获该致命错误 -
try { foo(); } catch (Throwable $e) { }—— 最稳妥写法,覆盖Exception和所有Error子类
没被 catch 的 Error 和 Exception 都会走 set_exception_handler
无论你漏写了 catch (Error $e) 还是 catch (Exception $e),只要最终没有匹配的 catch 块,PHP 都会把未捕获的 Throwable 实例交给 set_exception_handler() 注册的全局处理器。这意味着:
-
set_exception_handler(function (Throwable $e) { error_log($e); });是兜底日志记录的必要手段 -
register_shutdown_function()仍需保留,用于捕获parse errors(如语法错误)和memory_limit耗尽等真正无法抛出Throwable的极少数情况 -
error_reporting(E_ALL)和display_errors=Off对Error对象本身无效——它是否显示取决于有没有被catch或全局处理器拦截
为什么 catch (Throwable) 不是万能的
它能统一处理绝大多数 Exception 和 Error,但有三个现实限制:
- PHP 启动阶段的解析错误(如
php -f broken.php里有语法错)根本进不了脚本执行,set_exception_handler不生效,只能靠外部日志或php -l预检 - 某些
Error(如Fatal error: Allowed memory size exhausted)在内存彻底耗尽时可能连set_exception_handler都无法执行 - 你不能在
catch (Throwable $e)里安全地做复杂操作(如连接数据库、写文件),因为此时运行环境可能已不稳定;应优先记录原始信息($e->__toString()),再快速退出或降级
catch (Exception $e) 当成全部,却对 TypeError 或 ParseError 完全无感——直到线上突然 500,日志里只有 “Uncaught TypeError”,没有任何堆栈上下文。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











