抛出一个捕捉块(C+;+;)有效吗? 我没有做过C++,我的记忆很模糊,到目前为止我还没有找到一个明确的答案。我不是说重新触发捕获的异常,而是捕获一个异常并抛出另一种类型,例如: std::unordered_map<int, int> foo; ... int getFoo(int id) { try { return foo.at(id); } catch (std::out_of_range& e) { throw MyMoreDescriptiveExceptionType(); } } std::无序映射foo; ... intgetfoo(intid) { 试一试{ 返回foo.at(id); } 捕获(标准:超出范围和e) { 抛出MyMoreDescriptionExceptionType(); } }

抛出一个捕捉块(C+;+;)有效吗? 我没有做过C++,我的记忆很模糊,到目前为止我还没有找到一个明确的答案。我不是说重新触发捕获的异常,而是捕获一个异常并抛出另一种类型,例如: std::unordered_map<int, int> foo; ... int getFoo(int id) { try { return foo.at(id); } catch (std::out_of_range& e) { throw MyMoreDescriptiveExceptionType(); } } std::无序映射foo; ... intgetfoo(intid) { 试一试{ 返回foo.at(id); } 捕获(标准:超出范围和e) { 抛出MyMoreDescriptionExceptionType(); } },c++,exception,exception-handling,C++,Exception,Exception Handling,是。(必须填写到30个字符)是。(必须填写到30个字符)是。除此之外,它还允许您正确地记录和重新抛出异常 只是要小心正确地重新投掷。如果操作不正确,可能会丢失原始堆栈跟踪,从而使实际问题更难追踪。是。除此之外,它还允许您正确地记录和重新抛出异常 只是要小心正确地重新投掷。如果操作不正确,您可能会丢失原始堆栈跟踪,这使得实际问题更难跟踪。是,抛出的异常将被顺序中的下一个catch或上一级catch捕获,依此类推是,抛出的异常将被顺序中的下一个catch或上一级catch捕获,依此类推是,这是完全正

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

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

是。除此之外,它还允许您正确地记录和重新抛出异常


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

是。除此之外,它还允许您正确地记录和重新抛出异常


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

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

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

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


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

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


同样的抓包扔模式可以根据需要扩展到任意多个级别,直到有东西能够解决问题或优雅地关机。

就我个人而言,是你回答的后半部分帮了我+1就个人而言,是你回答的后半部分帮了我的忙+1同样,
抛出将重新显示正在处理的异常将重新引发正在处理的异常。您能否详细说明“正确重新引发”部分?OP中的示例代码会引起问题吗?@Merad-乍一看,是的。结果堆栈跟踪的来源将是您的
抛出
行,而不是实际导致原始异常的行。您能否详细说明“正确地重新抛出”部分?OP中的示例代码会引起问题吗?@Merad-乍一看,是的。生成的堆栈跟踪的来源将是您的
throw
行,而不是实际导致原始异常的行。