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

3

在后端处理过程中,如果我想停止一个操作,我一直在抛出异常。我忘记了我可以使用Laravel的abort()方法。是否有使用abort()而不是抛出异常的理由?它们基本上做相同的事情吗?

我之所以问这个问题,是因为我注意到当我跟踪日志时,abort()不会显示堆栈跟踪,但抛出异常会。在这些情况下,我不需要堆栈跟踪,因为我知道为什么会失败。我也不希望这些已知的失败让日志变得巨大。

2个回答

8

让我们来看看代码:

/**
 * 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

我不确定为什么使用 abort() 抛出异常会被记录,但使用时不会。您可能需要检查异常处理程序,并查看是否以不同的方式捕获和处理不同类型的异常。

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


2
在 Laravel 5.1 中,HttpException 没有被记录 (logged),因为它包含在 Exception Handler$dontReport 数组中。将其从数组中删除,就会被记录。
在 Laravel 8 中,HttpException 也没有被记录,但这是因为异常类型被添加到了 framework's Handler$internalDontReport 中。您可以在应用程序的 Handler 中添加一个 $internalDontReport 数组,不包括 HttpException::class 来覆盖它。
然而,HttpException 没有被记录是有原因的。您可能不希望在日志中记录 400、401、403、404 等错误。至少默认情况下不想要。
服务器错误 (状态码 500 及以上) 更重要,因为它们表明可能发生了本应避免的事情。例如通过更好地验证请求,您可以给用户提供一个验证错误。

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

总之,对于400级别的错误,只要您不想记录日志,就可能想使用abort()throw new HttpException()。对于500级别的错误,throw new MyCustomException()将被记录,只要它不扩展HttpException

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接