Laravel 8.x如何正确上报自定义异常并记录错误的文件与行号
问题原因与解决方法
1. $this->getMessage()返回null的原因
你使用throw_unless抛出异常时仅传入了异常类,没有传入异常消息参数,throw_unless的语法为:
throw_unless(判断条件, 异常类, 异常消息 = '', 错误码 = 0)
缺少消息参数时,异常实例的默认消息为空,因此调用getMessage()会返回null。
2. report方法不执行、日志为空的常见原因
- 原因1:日志级别配置过滤了warning级别的日志,检查
.env文件中LOG_LEVEL参数,如果值为error及以上级别,warn/warning级别的日志会被直接忽略 - 原因2:
app/Exceptions/Handler.php文件中的$dontReport数组加入了SSOException::class,Laravel会跳过该类异常的自动报告逻辑
修复步骤
步骤1:修改异常抛出代码,传入异常消息
throw_unless( strlen($state) > 0 && $state === $request->state, SSOException::class, 'SSO state参数校验不通过', // 可自定义异常消息内容 403 // 可选自定义错误码 );
步骤2:调整自定义异常代码
确保异常类顶部引入Log facade,同时report方法可补充文件、行数、追踪栈信息:
<?php namespace App\Exceptions; // 请根据你的实际命名空间调整 use Exception; use Illuminate\Support\Facades\Log; class SSOException extends Exception { public function report() { // 可根据需求调整日志级别,比如改为error避免被低级别配置过滤 Log::error("单点登录异常:{$this->getMessage()},文件:{$this->getFile()},行数:{$this->getLine()},追踪栈:{$this->getTraceAsString()}"); } public function render(\Illuminate\Http\Request $request) { if($request->user()) { \Illuminate\Support\Facades\Auth::logout(); $request->session()->invalidate(); $request->session()->regenerateToken(); } return view('exceptions.sso', [ 'context' => $this->context(), ]); } public function context() { return [ 'request' => request()->all(), 'exception' => $this->getMessage(), // 此时已能正常拿到异常消息 ]; } }
步骤3:检查异常报告配置
打开app/Exceptions/Handler.php,确认$dontReport数组中没有SSOException::class条目,同时调整.env中LOG_LEVEL为warning或更低级别(如debug、info)。
内容的提问来源于stack exchange,提问作者Jaquarh
相关产品推荐
相关产品推荐

