必须禁用ci4原生错误处理器并手动注册whoops实例,否则whoops无法接管错误流;需在exceptions.php中设$handlesweb=false,在development.php中调用$whoops->register(),并扩展error_reporting范围以捕获非致命错误。

CodeIgniter 默认的错误页面太简陋,Whoops_CodeIgniter 能替换它,但直接装上不等于就能用——关键得让 CodeIgniter 的错误处理流程真正把控制权交出去。
Whoops_CodeIgniter 不会自动接管 CodeIgniter 错误流
CodeIgniter 4 自带错误处理器(CI\Exceptions\Logger 和 CI\Exceptions\ErrorHandler),默认会拦截所有未捕获异常和错误,根本不会走到 Whoops 的 register()。所以光 composer require filp/whoops + whoops/codeigniter 没用。
- 必须在
app/Config/Exceptions.php中禁用原生错误处理器:把$handlesConsole = true和$handlesWeb = true全部设为false - 在
app/Config/Boot/production.php或development.php中(推荐 development)手动注册 Whoops 实例:$whoops = new \Whoops\Run(); $whoops->pushHandler(new \Whoops\Handler\PrettyPageHandler()); $whoops->register();
- 注意顺序:Whoops
register()必须在 CI 的Services::exceptions()初始化之后、任何可能抛错的代码之前执行,否则会被覆盖
PHP 错误级别必须匹配 Whoops 捕获范围
Whoops 默认只捕获 E_ERROR、E_PARSE、E_COMPILE_ERROR、E_USER_ERROR 等致命错误,而 CodeIgniter 开发时常见的 E_NOTICE 或 E_DEPRECATED 会被忽略,导致页面白屏却没 Whoops 页面。
- 在 Whoops 初始化后加一行:
$whoops->allowQuit(false);(防止 fatal error 后直接 exit) - 显式扩展错误类型:
$whoops->handleError(E_ALL & ~E_STRICT & ~E_USER_DEPRECATED);
- 确保
error_reporting在入口文件(如public/index.php)中已设为E_ALL,否则 PHP 根本不触发错误回调
模板渲染阶段出错时 Whoops 可能失效
CodeIgniter 的视图渲染(view())发生在响应已开始输出后,此时 PHP 的输出缓冲可能已开启,Whoops 的 HTML 页面无法正常写入——你只会看到部分 HTML + 一堆 Warning,没有漂亮面板。
- 在
app/Config/View.php中关闭自动输出缓冲:$useBuffer = false;(仅开发环境) - 或改用
view(..., [], ['debug' => true])强制提前触发错误检查 - 更稳妥的做法:把视图逻辑拆到控制器里做数据预检,避免模板里出现
$user->name这类未定义属性访问
Whoops 的“优雅”依赖于它能完整接管错误生命周期,而 CodeIgniter 的封装太深——漏掉 Exceptions.php 里的开关,或忘了调整 error_reporting,它就只是个躺在 vendor 里的装饰品。











