在后端处理过程中,如果我想停止一个操作,我一直在抛出异常。我忘记了我可以使用Laravel的abort()方法。是否有使用abort()而不是抛出异常的理由?它们基本上做相同的事情吗?
我之所以问这个问题,是因为我注意到当我跟踪日志时,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
。
我不确定为什么使用 abort()
抛出异常会被记录,但使用时不会。您可能需要检查异常处理程序,并查看是否以不同的方式捕获和处理不同类型的异常。
您不应该担心日志文件的大小。如今存储非常便宜,文本占用的空间很少。从日志中获得的知识将远远超过它们的物理成本。
$dontReport
数组中。将其从数组中删除,就会被记录。$internalDontReport
中。您可以在应用程序的 Handler
中添加一个 $internalDontReport
数组,不包括 HttpException::class
来覆盖它。这意味着如果您使用abort(500)
助手,用户将在浏览器中收到500错误,但不会被记录,因为abort throws a HttpException。
总之,对于400级别的错误,只要您不想记录日志,就可能想使用abort()
或throw new HttpException()
。对于500级别的错误,throw new MyCustomException()
将被记录,只要它不扩展HttpException
。
如果您不想依赖Laravel自动记录某些异常(但不一定是所有异常),您可以在抛出异常或使用abort()
之前始终调用Log::error("Some descriptive message");
。