如果这些信息是否正确,任何人都可以确认我:
在C ++中,我们可以使用throw语句重新抛出异常,但抛出的异常应该与当前捕获的异常相同。
答案 0 :(得分:11)
throw;
本身在一个catch块中重新抛出刚捕获的异常。如果您需要(例如)执行一些清理操作以响应异常,这仍然很有用,但仍然允许它将upstack传播到可以更全面地处理的地方:
catch(...)
{
cleanup();
throw;
}
但你完全可以自由地做到这一点:
catch(SomeException e)
{
cleanup();
throw SomeOtherException();
}
事实上,为了将您调用的代码抛出的异常转换为您所记录的任何类型,它通常很方便。
答案 1 :(得分:4)
不一定。一旦你抓住它,它取决于你如何处理它。您可以抛出相同的异常或全新的异常。或者,根本不做任何事情。
答案 2 :(得分:3)
重新抛出的异常可以有不同的类型。 这在VS2012上正确编译并运行
// exceptions
#include <iostream>
using namespace std;
int main () {
try{
try
{
throw 20;
}
catch (int e)
{
cout << "An exception occurred. Exception Nr. " << e << '\n';
throw string("abc");
}
}
catch (string ex)
{
cout<<"Rethrow different type (string): "<< ex<<endl;
}
return 0;
}
输出:
发生了异常。例外Nr。 20
Rethrow不同类型(字符串):abc