如何从“catch all”块重新抛出异常在C ++中生成相同的异常?

时间:2018-06-11 06:53:46

标签: c++ exception-handling

#include<iostream>
#include<exception>
using namespace std;

int main()
{
    try{
        try{
            throw 20;
        }catch(...)
        {
            cout<<"Unknown exception in inner block"<<endl;
            throw;
        }
    }catch(int e)
    {
        cout<<"Integer Exception "<<e<<endl;
    }catch(...)
    {
        cout<<"Unknown exception in outer block"<<endl;
    }
}

上面的代码给出了输出:

Unknown exception in inner block    
Integer Exception 20

我在回答中读到,无法在catch all块中确定异常。

2 个答案:

答案 0 :(得分:2)

当您编写throw;时,C ++编译器会通过引用重新捕获捕获的异常

除非拦截catch (...)声明,否则几乎就好像std::cout不存在一样。

所以它在int e捕获网站上被重新捕获。

C ++ 11在某种程度上允许您在catch块中捕获异常,包括 catch (...),但是没有可移植的方法来检查{}中捕获的异常{1}}阻止。请参阅http://en.cppreference.com/w/cpp/error/current_exception

答案 1 :(得分:1)

重新抛出异常不会生成新的异常对象。相反,它继续抛出相同的异常对象。

  

18.1抛出异常[except.throw]

     
      
  1. ...如果处理程序通过重新抛出退出,则控制权将传递给同一异常对象的另一个处理程序。
  2.