Skip to content

Laravel - 错误处理

当你创建一个新的 Laravel 项目时,错误和异常处理已经为你配置好了。App\Exceptions\Handler 类负责记录应用程序触发的所有异常,并将其渲染回用户。我们将在这篇文档中深入探讨这个类。

异常处理器的 report() 方法用于记录异常或将其发送到外部服务,如 Flare、Bugsnag 或 Sentry。默认情况下,report() 方法将异常传递给基类,在那里记录异常。但是,你可以按照你喜欢的方式记录异常。

如果你需要以不同的方式报告不同类型的异常,可以使用 instanceof 比较运算符:

public function report(Throwable $exception)
{
if ($exception instanceof \App\Exceptions\CustomException) {
// 自定义报告逻辑
}
parent::report($exception);
}

render() 方法负责将给定的异常转换为应发送回浏览器的 HTTP 响应。默认情况下,异常被传递给基类,由基类为你生成响应。但是,你可以检查异常类型或返回你自己的自定义响应。

异常处理器的 $dontReport 属性包含一个不会被记录的异常类型数组。例如,由 404 错误以及其他几种类型的错误引起的异常默认不会写入你的日志文件。你可以根据需要向此数组添加其他异常类型:

protected $dontReport = [
\Illuminate\Auth\AuthenticationException::class,
\Illuminate\Database\Eloquent\ModelNotFoundException::class,
// 在这里添加其他异常类型
];

某些异常描述了服务器的 HTTP 错误代码,如 404 (未找到)、403 (禁止访问) 或 500 (内部服务器错误)。要在应用程序中的任何地方生成此类响应,可以使用 abort 助手函数:

abort(404); // 将触发 404 未找到错误
abort(403, 'Unauthorized action.'); // 将触发 403 禁止访问错误并带有一条消息

Laravel 可以轻松地为各种 HTTP 状态码显示自定义错误页面。例如,如果你希望自定义 404 HTTP 状态码的错误页面,可以创建一个 resources/views/errors/404.blade.php 文件。应用程序生成的所有 404 错误都将渲染此文件。此目录中的视图应以其对应的 HTTP 状态码命名。abort 函数引发的 HttpException 实例将作为 $exception 变量传递给视图。

步骤 1:在 routes/web.php 中添加一个将触发 404 错误的路由。

routes/web.php

Route::get('/trigger-404', function(){
abort(404);
});

步骤 2:在 resources/views/errors/404.blade.php 创建一个视图文件并添加你的自定义 HTML 内容。

resources/views/errors/404.blade.php

<!DOCTYPE html>
<html>
<head>
<title>Page Not Found (404)</title>
<link href="https://fonts.googleapis.com/css?family=Lato:100" rel="stylesheet" type="text/css"/>
<style>
html, body {
height: 100%;
}
body {
margin: 0;
padding: 0;
width: 100%;
color: #B0BEC5;
display: table;
font-weight: 100;
font-family: 'Lato', sans-serif;
}
.container {
text-align: center;
display: table-cell;
vertical-align: middle;
}
.content {
text-align: center;
display: inline-block;
}
.title {
font-size: 72px;
margin-bottom: 40px;
}
</style>
</head>
<body>
<div class="container">
<div class="content">
<div class="title">Oops! Page Not Found. (404 Error)</div>
@isset($exception) {{-- 如果 abort 调用时带有消息,则显示消息 --}}
<p>{{ $exception->getMessage() }}</p>
@endisset
</div>
</div>
</body>
</html>

步骤 3:在浏览器中访问以下 URL 以测试自定义错误页面。

http://localhost:8000/trigger-404

步骤 4:访问 URL 后,你将看到你的自定义 404 错误页面,显示“Oops! Page Not Found. (404 Error)”。

有关更高级的错误处理技术,包括如何以不同方式处理特定异常类型,请参阅 Laravel 官方文档中的错误处理部分。