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

Laravel 9中判断异常是否可报告及API自定义错误响应

Laravel 9 API自定义错误响应实现

要实现关闭调试模式后,给内部服务器错误添加code字段,同时隐藏敏感异常信息,你可以通过Laravel异常处理器的renderable回调,结合环境配置和异常类型判断来实现:

具体实现代码

修改app/Exceptions/Handler.php中的register方法:

public function register()
{
    $this->reportable(function (Throwable $e) {
        // 保留默认的报告逻辑,或根据需求自定义
    });

    $this->renderable(function (Throwable $e) {
        // 仅在调试模式关闭时,隐藏内部异常详情
        if (!config('app.debug')) {
            // 判断是否为HTTP状态异常(如404、403、422等)
            if ($this->isHttpException($e)) {
                $statusCode = $e->getStatusCode();
                // 优先使用异常自带的消息,无消息则用HTTP状态码对应的默认文本
                $message = $e->getMessage() ?: \Illuminate\Http\Response::$statusTexts[$statusCode];
                
                return response()->json([
                    'code' => $statusCode,
                    'message' => $message
                ], $statusCode);
            }

            // 非HTTP异常(如数据库错误、代码逻辑错误等),返回通用500响应
            return response()->json([
                'code' => 500,
                'message' => 'Server Error'
            ], 500);
        }

        // 调试模式开启时,返回详细异常信息(方便开发调试)
        return response()->json([
            'code' => $e->getCode() ?: 500,
            'message' => $e->getMessage(),
            'trace' => $e->getTraceAsString()
        ], $e->getCode() ?: 500);
    });
}

逻辑说明

  1. 环境判断:通过config('app.debug')判断调试模式是否关闭,仅在生产环境(或调试关闭)时隐藏异常详情。
  2. HTTP异常识别:使用$this->isHttpException($e)区分HTTP状态类异常(这类异常是用户可感知的,比如路由不存在、参数验证失败等),返回对应的状态码和友好消息。
  3. 内部异常处理:对于非HTTP异常(如数据库连接失败、代码语法错误等),统一返回code=500的通用错误响应,避免暴露敏感的系统信息。
  4. 调试模式兼容:调试模式开启时,返回包含异常追踪的详细信息,方便开发定位问题。

扩展:自定义异常支持

如果有自己定义的业务异常类,希望展示具体的错误信息,可以在HTTP异常判断中加入自定义异常的判断:

if ($this->isHttpException($e) || $e instanceof \App\Exceptions\YourCustomException) {
    // 处理自定义异常的响应逻辑
    $statusCode = method_exists($e, 'getStatusCode') ? $e->getStatusCode() : 400;
    return response()->json([
        'code' => $e->getCode() ?: $statusCode,
        'message' => $e->getMessage()
    ], $statusCode);
}

内容的提问来源于stack exchange,提问作者Vüsal Hüseynli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 04:05:21