Laravel Laravel
  • 前言

    • 发行说明
    • 升级向导
    • 贡献导引
  • 入门指南

    • 安装
    • 配置
    • 文件夹结构
    • 入门套件
    • 部署
  • 架构思想

    • 请求生命周期
    • 服务容器
    • 服务提供者
    • Facades:门面
  • 基础功能

    • 路由
    • 中间件
    • CSRF 保护
    • 控制器
    • 请求
    • 响应
    • 视图
    • Blade 模板
    • URL 生成
    • Session
    • 表单验证
    • 错误处理
    • 日志
  • 深入话题

    • Artisan 命令行
    • 广播
    • 缓存
    • 集合
    • 编译资源
    • Contracts:契约
    • 事件
    • 文件存储
    • 辅助函数
    • HTTP 客户端
    • 本地化
    • Mail
    • 消息通知
    • 扩展包开发
    • 队列
    • Rate Limiting
    • 任务调度
  • 安全

    • 身份认证
    • 授权
    • 邮件验证
    • 加密
    • 哈希
    • 重置密码
  • 数据库

    • 快速入门
    • 查询构造器
    • 分页
    • 数据库迁移
    • 数据填充
    • Redis
  • Eloquent ORM

    • 快速入门
    • 关联关系
    • Eloquent 集合
    • 修改器
    • API 资源
    • 序列化
  • 测试

    • 快速入门
    • HTTP 测试
    • 命令行测试
    • 浏览器测试
    • 数据库测试
    • 测试模拟器Mocking
  • 官方扩展包

    • Breeze
    • Cashier (Stripe)
    • Cashier (Paddle)
    • Dusk 浏览器测试
    • Envoy 部署工具
    • Fortify 授权生成器
    • Homestead 虚拟机
    • Horizon 队列管理工具
    • Jetstream:全栈开发
    • Octane 加速引擎
    • Passport OAuth 认证
    • Sail 开发环境
    • Sanctum 轻量级 API 认证
    • Scout 全文搜索
    • Socialite 社会化登录
    • Telescope 调试工具
    • Valet 集成环境
  • API Documentation
Icon

提示 您正在浏览旧版本的 Laravel 的文档. 请考虑将你的项目升级到 Laravel 11.x.

68 1

错误处理
8.5
8.5 8.x 7.x 6.x 5.8 5.7 5.6 5.5 5.4 5.3 5.2 5.1

Laravel 8 中文文档 /

未匹配的标注

错误处理

  • 介绍
  • 配置
  • 异常处理
    • 异常报告
    • 忽略指定类型异常
    • 渲染异常
    • Reportable & Renderable 异常
  • HTTP 异常
    • 自定义 HTTP 错误页面

介绍

当你开始一个新的 Laravel 项目时, 它已经为您配置了错误和异常处理。 App\Exceptions\Handler 类用于记录应用程序触发的所有异常,然后将其呈现回用户。我们将在本文中深入讨论这个类。

配置

你的 config/app.php 配置文件中的 debug 选项决定了对于一个错误实际上将显示多少信息给用户。默认情况下,该选项的设置将遵照存储在 .env 文件中的 APP_DEBUG 环境变量的值。

对于本地开发,你应该将 APP_DEBUG 环境变量的值设置为 true。在生产环境中,该值应始终为 false。如果在生产中将该值设置为 true,则可能会将敏感配置值暴露给应用程序的终端用户。

异常处理

异常报告

所有异常都是由 App\Exceptions\Handler 类处理。此类包含一个 register 方法,可以在其中注册自定义异常报告程序和渲染器回调。我们将详细研究每个概念。异常报告用于记录异常或将其发送到如 Flare、Bugsnag 或 Sentry 等外部服务。默认情况下,将根据你的 日志 配置来记录异常。不过,你可以用任何自己喜欢的方式来记录异常。

例如,如果您需要使用不同的方式来报告不同的异常,您可以使用 reportable 方法来注册一个闭包,当需要报告给定的异常的时候便会执行它。 Laravel 将通过检查闭包的类型提示来判断闭包报告的异常类型:

use App\Exceptions\InvalidOrderException;

/**
 * 为应用程序注册异常处理回调
 *
 * @return void
 */
public function register()
{
    $this->reportable(function (InvalidOrderException $e) {
        //
    });
}

当您使用 reportable 方法注册一个自定义异常报告回调时, Laravel 依然会使用默认的日志配置记录下应用异常。 如果您想要在默认的日志堆栈中停止这个行为,您可以在定义报告回调时使用 stop 方法:

$this->reportable(function (InvalidOrderException $e) {
    //
})->stop();

$this->reportable(function (InvalidOrderException $e) {
    return false;
});

技巧:要为给定的异常自定义异常报告,您可以使用 可报告异常

全局日志上下文

在可用的情况下, Laravel 会自动将当前用户的编号作为数据添加到每一条异常日志信息中。您可以通过重写 App\Exceptions\Handler 类中的 context 方法来定义您自己的全局上下文数据(环境变量)。此后,每一条异常日志信息都将包含这个信息:

/**
 * 获取默认日志的上下文变量
 *
 * @return array
 */
protected function context()
{
    return array_merge(parent::context(), [
        'foo' => 'bar',
    ]);
}

report 助手

有时你需要报告异常,但仍需继续处理当前请求。 report 助手函数允许你通过异常处理器快速报告异常,并且不会渲染错误页面给用户:

public function isValid($value)
{
    try {
        // 验证值 ...
    } catch (Throwable $e) {
        report($e);

        return false;
    }
}

根据类型忽略异常

在创建应用时,有些类型的异常你想简单地忽略不去报告。应用异常处理器包含了一个初始化为空数组的 $dontReport 属性,任何类添加到里面都不会被报告;然而,它们还是可能会有自定义的渲染逻辑:

use App\Exceptions\InvalidOrderException;

/**
 * 不报告的异常类型列表
 *
 * @var array
 */
protected $dontReport = [
    InvalidOrderException::class,
];

技巧:Laravel 已经默默地为你忽略了一些错误的类型,像是 404 HTTP "not found" 错误或者 由 CSRF 令牌无效产生的 419 HTTP 响应结果导致的异常。

渲染异常

默认情况下,Laravel 异常处理器会为你把异常转换为 HTTP 响应。然而,你可以自由地为特定类型的异常注册一个自定义的渲染闭包来实现。

传递给 renderable 方法的闭包函数应返回一个 Illuminate\Http\Response 的实例,它可以通过 response 助手函数生成。 Laravel 将会根据闭包的类型提示来推断闭包渲染的异常类型:

use App\Exceptions\InvalidOrderException;

/**
 * 注册异常处理回调
 *
 * @return void
 */
public function register()
{
    $this->renderable(function (InvalidOrderException $e, $request) {
        return response()->view('errors.invalid-order', [], 500);
    });
}

Reportable & Renderable 异常

除了在异常控制器的 register方法中检查异常类型外,你可以直接地在自定义异常里定义 report 和 render 。当这些方法存在时,它们将被框架自动调用:

<?php

namespace App\Exceptions;

use Exception;

class InvalidOrderException extends Exception
{
    /**
     * 报告异常.
     *
     * @return bool|null
     */
    public function report()
    {
        //
    }

    /**
     *渲染异常为 HTTP 响应。
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function render($request)
    {
        return response(...);
    }
}

如果你的异常中包含了仅在满足特定条件才报告的自定义报告逻辑,你可能需要指示 Laravel 使用默认的异常处理配置报告异常。你可以在异常的 report 方法中返回 false 实现这个:

/**
 * 报告异常。
 *
 * @return bool|null
 */
public function report()
{
    // 判断异常是否需要自定义报告...

    return false;
}

技巧:你可以通过类型提示输入 report 方法所需的依赖项,Laravel的 服务容器 会自动把它们注入到此方法中。

HTTP 异常

某些异常描述了服务器的 HTTP 错误代码。例如,可能是 「 页面未找到 」 错误 (404),「 未经授权的错误 」(401)或者甚至是开发者造成的 500 错误。要在应用的任意地方生成此类响应,你可以使用 abort 辅助函数:

abort(404);

自定义 HTTP 错误页

Laravel 创建了可以轻松显示各种 HTTP 状态码的自定义错误页面。例如,如果你想自定义 404 HTTP 状态码页面,只需创建一个 resources/views/errors/404.blade.php 文件。它会用来处理所有应用程序产生的 404 错误。视图目录下所有文件命名都应和它们所响应的 HTTP 状态码一一对应。abort 方法会调用 Symfony\Component\HttpKernel\Exception\HttpException 的实例,它将被作为 $exception 变量传递给视图:

<h2>{{ $exception->getMessage() }}</h2>

您可以使用vendor:publish Artisan 命令发布模板,然后根据自己的喜好进行自定义:

php artisan vendor:publish --tag=laravel-errors

本文章首发在 网站上。


上一篇 下一篇

成为Laravel合作伙伴

Laravel Partners是提供一流Laravel开发和咨询服务的精英商店。我们每个合作伙伴都可以帮助您制定一个精美,结构完善的项目.

我们的伙伴
Laravel
亮点
  • Our Team
  • 发布说明
  • 入门
  • 路由
  • Blade 模板
  • 身份验证
  • 用户授权
  • Artisan 控制台
  • 数据库
  • Eloquent ORM
  • 测试
资源
  • Laravel Bootcamp
  • Laracasts
  • Laravel News
  • Laracon
  • Laracon EU
  • Laracon India
  • Jobs
  • Forums
  • Trademark
  • 版本发布时间
  • 包开发
  • 命令行应用
  • TALL stack全栈开发
  • Blade UI Kit
  • 前端资源构建
伙伴
  • WebReinvent
  • Vehikl
  • Tighten
  • 64 Robots
  • Active Logic
  • Byte 5
  • Curotec
  • Cyber-Duck
  • DevSquad
  • Jump24
  • Kirschbaum
生态系统
  • Cashier
  • Dusk
  • Echo
  • Envoyer
  • Forge
  • Horizon
  • Nova
  • Octane
  • Sail
  • Sanctum
  • Scout
  • Spark
  • Telescope
  • Valet
  • Vapor

Laravel是一个具有表达力,优雅语法的Web应用程序框架。我们认为,发展必须是一种令人愉悦的创造力,才能真正实现。Laravel试图通过减轻大多数Web项目中使用的常见任务来减轻开发的痛苦.

Laravel是Taylor Otwell的商标.
Copyright © 2011-2025 Laravel中文网 LLC.

  • Twitter
  • GitHub
  • Discord
Laravel 全栈开发网 推荐使用阿里云 按Ctrl+D试试