【发布时间】:2014-06-19 17:10:36
【问题描述】:
任何人都可以确认我的信息是否正确:
在 C++ 中,在 catch 块中,我们可以使用 throw 语句重新抛出异常,但抛出的异常应该与当前捕获的异常具有相同的类型。
【问题讨论】:
-
我当然不希望;或者我的异常处理代码中有很大一部分是错误的! ;)
任何人都可以确认我的信息是否正确:
在 C++ 中,在 catch 块中,我们可以使用 throw 语句重新抛出异常,但抛出的异常应该与当前捕获的异常具有相同的类型。
【问题讨论】:
不一定。一旦你抓住它,如何处理它取决于你。您可以抛出相同的异常或全新的异常。或者,什么都不做。
【讨论】:
重新抛出的异常可以有不同的类型。 这可以在 VS2012 上正确编译和运行:
#include <iostream>
int main() try
{
try
{
throw 20;
}
catch (int e)
{
std::cout << "An exception occurred. Exception Nr. " << e << std::endl;
throw std::string("abc");
}
}
catch (std::string const & ex)
{
std::cout << "Rethrow different type (string): " << ex << std::endl;
}
输出:
An exception occurred. Exception Nr. 20
Rethrow different type (string): abc
【讨论】:
throw; 总是会重新抛出现有的异常,从而产生一些巧妙的技巧。
20 不在您的示例输出中?
throw; 本身在一个 catch 块中重新抛出刚刚捕获的异常。如果您需要(例如)执行一些清理操作以响应异常,但仍允许它向上传播到可以更充分地处理它的地方,这很有用:
catch(...)
{
cleanup();
throw;
}
但你也完全可以这样做:
catch(SomeException e)
{
cleanup();
throw SomeOtherException();
}
事实上,这样做通常很方便,以便将您调用的代码引发的异常转换为您记录的任何类型。
【讨论】: