Laravel 5.1 - 抛出异常和 abort() 的区别

Laravel 5.1 - Difference between throwing Exceptions and abort()

当我想在后端处理期间停止操作时,我一直在抛出异常。我忘了我可以使用 Laravel abort() 方法。是否有任何理由使用 abort() 而不是抛出异常?它几乎做同样的事情吗?

我也在问,因为我注意到当我跟踪我的日志时,abort() 不显示堆栈跟踪,但抛出异常会显示。在这些情况下我不需要堆栈跟踪,因为我知道它失败的原因。我也不希望日志因这些已知故障而变得庞大。

我们来看看代码:

/**
 * Throw an HttpException with the given data.
 *
 * @param  int     $code
 * @param  string  $message
 * @param  array   $headers
 * @return void
 *
 * @throws \Symfony\Component\HttpKernel\Exception\HttpException
 * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException
 */
public function abort($code, $message = '', array $headers = array())
{
    if ($code == 404)
    {
        throw new NotFoundHttpException($message);
    }

    throw new HttpException($code, $message, null, $headers);
}

所以看起来 abort 方法只是一个辅助函数,如果代码 404 被传递,它会抛出一个 NotFoundHttpException,否则它会抛出一个 HttpException

我不确定为什么抛出 Exception 会导致日志记录,而使用 abort() 则不会。您可能想检查您的异常处理程序并查看是否以不同方式捕获和处理不同类型的异常。

您不必担心日志文件的大小。现在存储非常便宜,文本占用很少 space。您从日志中获得的知识将远远超过它们的物理成本。

在 Laravel 5.1 中,没有报告(记录)HttpException,因为它包含在 Exception Handler$dontReport 数组中。从数组中删除它,它会被记录下来。

在Laravel 8中也没有报HttpException,这是因为framework's Handler中的$internalDontReport增加了异常类型。您可以将 $internalDontReport 数组添加到您的应用程序 Handler 而无需 HttpException::class 覆盖它。

但是,由于某种原因没有报告 HttpException。您可能不希望日志中出现 400、401、403、404 等等。至少默认情况下不是。

服务器错误(状态代码 500 及以上)可能更需要记录,因为它们表明出现了本来可以避免的错误。 IE。通过更好地验证请求,您可以给用户一个验证错误。

这意味着如果您使用 abort(500) 帮助程序,用户将在浏览器中收到 500 错误,但不会被记录,因为 abort throws a HttpException.

总而言之,只要您不想记录,您可能 想对 400 级错误使用 abort()throw new HttpException()。对于 500 级错误,只要不扩展 HttpException.

,就会记录 throw new MyCustomException()

如果你不想依赖 Laravel 自动记录一些异常(但不一定是所有异常),你总是可以在抛出异常之前调用 Log::error("Some descriptive message"); 或使用 abort().