在catch块中重新抛出异常

时间:2014-05-02 22:34:09

标签: c++ exception throw

如果这些信息是否正确,任何人都可以确认我:

在C ++中,我们可以使用throw语句重新抛出异常,但抛出的异常应该与当前捕获的异常相同。

3 个答案:

答案 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