You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 17:45:04