Laravel 为用户提供了一个基础的全局异常拦截处理器App\Exceptions\Hander。如果没有全局的异常错误拦截器,那我们在每个可能发生错误异常的业务逻辑分支中,都要使用 try ... catch,然后将执行结果返回 Controller层,再由其根据结果来构造相应的 Response,那代码冗余的会相当可以。
全局异常错误处理,是每个框架都应该具备的,这次我们就通过简析 Laravel 的源码和执行流程,来看一下此模式是如何被运用的。
源码解析
laravel/laravel 脚手架中有一个预定义好的异常处理器:
app/Exceptions/Handler.php
namespace App\Exceptions;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
class Handler extends ExceptionHandler
{
// 不被处理的异常错误
protected $dontReport = [];
// 认证异常时不被flashed的数据
protected $dontFlash = [
'password',
'password_confirmation',
];
// 上报异常至错误driver,如日志文件(storage/logs/laravel.log),第三方日志存储分析平台
public function report(Exception $exception)
{
parent::report($exception);
}
// 将异常信息响应给客户端
public function render($request, Exception $exception)
{
return parent::render($request, $exception);
}
}
当 Laravel 处理一次请求时,在启动文件中注册了以下服务:
bootstrap/app.php
// 绑定 http 服务提供者
$app->singleton(
Illuminate\Contracts\Http\Kernel::class,
App\Http\Kernel::class
);
// 绑定 cli 服务提供者
$app->singleton(