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

Posted

技术标签:

【中文标题】Laravel 5.1 - 抛出异常和 abort() 的区别【英文标题】:Laravel 5.1 - Difference between throwing Exceptions and abort() 【发布时间】:2016-01-14 23:34:12 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

我们看一下代码:

/**
 * 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() 不会。您可能需要检查您的异常处理程序,看看是否有不同类型的异常被捕获并以不同方式处理。

您不必担心日志文件的大小。如今,存储非常便宜,文本占用的空间非常小。您从日志中获得的知识将远远超过其物理成本。

【讨论】:

【参考方案2】:

在 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。

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

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

【讨论】:

以上是关于Laravel 5.1 - 抛出异常和 abort() 的区别的主要内容,如果未能解决你的问题,请参考以下文章

C# - 线程中止异常(Thread Abort Exception)重新抛出自身

如何捕获ctypes中抛出的异常?

FlaskFlask框架使用中异常捕获

Flask abort

检测异常未被用户捕获而不重新抛出

Laravel 测试无异常,抛出异常