1

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

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

4 回答 4

7

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

于 2013-11-08T20:46:14.077 回答
4

是的。除其他外,它允许您正确记录和重新抛出异常。

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

于 2013-11-08T20:47:47.770 回答
3

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

相同的 catch-wrap-throw 模式可以根据需要扩展任意多个级别,直到能够解决问题或优雅地关闭。

于 2013-11-08T20:51:53.873 回答
1

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

于 2013-11-08T20:48:39.437 回答