Laravel 错误处理:忽略异常 1 个改进

有时候我们不希望 Laravel 的异常处理器处理所有的异常,比如用户访问了一个不存在的路由,并收到了一个 404 NOT FOUND 响应。这时我们只需要将我们想要忽略的异常写入类 App\Exceptions\Handler$dontReport 属性中即可:

// app/Exceptions/Handler.php

use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;

class Handler extends ExceptionHandler
{
    // ...

    protected $dontReport = [
        NotFoundHttpException::class
    ];

    // ...
}

实际上 Laravel 已经帮我们将一些不需要处理的异常写入到 $dontReport 属性中了,我们可以在 App\Exceptions\Handler 的父类 Illuminate\Foundation\Exceptions\Handler 中看到以下代码:

// vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php

use Illuminate\Auth\AuthenticationException;
use Illuminate\Validation\ValidationException;
use Illuminate\Session\TokenMismatchException;
use Illuminate\Auth\Access\AuthorizationException;
use Illuminate\Http\Exceptions\HttpResponseException;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;

class Handler implements ExceptionHandlerContract
{
    // ...

    // 自定义的不需要处理的异常
    protected $dontReport = [];

    //  默认的不需要报告的异常
    protected $internalDontReport = [
        AuthenticationException::class, // 认证相关的异常
        AuthorizationException::class, // 授权相关的异常
        HttpException::class, // HTTP 相关的异常
        HttpResponseException::class, // HTTP 响应相关的异常
        ModelNotFoundException::class, // 模型不存在的异常
        TokenMismatchException::class, // Token 不匹配的异常
        ValidationException::class, // 表单验证异常
    ];

    protected function shouldntReport(Exception $e)
    {
        //  合并默认的不需要处理的异常、我们自定义的不需要处理的异常
        $dontReport = array_merge($this->dontReport, $this->internalDontReport);

        return ! is_null(Arr::first($dontReport, function ($type) use ($e) {
            return $e instanceof $type;
        }));
    }

    public function report(Exception $e)
    {
        // 判断传入的异常是否需要被处理,若不需要则直接返回
        if ($this->shouldntReport($e)) {
            return;
        }
        // ...
    }
    // ...
}

对于 404 NOT FOUND 异常,因为类 NotFoundHttpExceptionHttpException 的子类,而 HttpException 被写入到了 $internalDontReport 属性,所以即使我们没有将 NotFoundHttpException 写入 $dontReport,Laravel 也不会处理该异常。

本文为 Wiki 文章,邀您参与纠错、纰漏和优化
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!