扔进一个捕获块(C++)是否有效

Is it valid to throw in a catch block (C++)?

本文关键字:C++ 是否 有效 一个      更新时间:2023-10-16

我已经有一段时间没有做C++了,我的记忆很模糊,到目前为止我还没有找到明确的答案。 我不是在谈论重新抛出捕获的异常,而是捕获一个异常并抛出另一种类型,例如:

std::unordered_map<int, int> foo;
...
int getFoo(int id)
{
  try {
    return foo.at(id);
  }
  catch (std::out_of_range& e)
  {
    throw MyMoreDescriptiveExceptionType();
  }
}

是的。(必须填写才能达到 30 个字符)

是的。除此之外,它还允许您正确记录和重新引发异常。

只是要小心正确地重新投掷。如果操作不正确,您可能会丢失原始堆栈跟踪,这使得实际问题更难追踪。

是的,这是完全有效的。这实际上是一件很常见的事情。例如,小型实用程序类可能会引发相当通用的异常。调用它的代码可能会捕获该异常,并将其包装在更具体的异常中,从而提供有关上下文的更有用的信息。然后,它将抛出该"外部"异常。

相同的捕获-包装-抛出模式可以根据需要扩展任意多个级别,直到某些内容能够解决问题或正常关闭。

是的

,抛出的异常将被下一个捕获顺序或下一个上层捕获捕获,依此类推