Laravel 错误处理:忽略异常
有时候我们不希望 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
异常,因为类 NotFoundHttpException
是 HttpException
的子类,而 HttpException
被写入到了 $internalDontReport
属性,所以即使我们没有将 NotFoundHttpException
写入 $dontReport
,Laravel 也不会处理该异常。