当我们抛出一个对象/变量来捕获时会发生什么?

how*_*rks 1 c++ exception throw rethrow

两个问题1)当抛出一个Object /变量时会发生什么?比如说,

int foo() {
   FILE *fp = ....;
   int dummy = 10;
   int *dummy_ptr = new int[10];
   throw 1;
}

int main() {
 try {
   foo();
 } catch (int &i) { 
   std::cout<<"ERROR, the value is "<<i<<std::endl;
 }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,这里会发生什么?创建一个新变量然后传递???

如果我使用指针或没有引用的变量该怎么办

喜欢catch(int*i)//或catch(int i)

此外,在范围内声明或启动的所有变量/资源是否已被释放/关闭?

2)同样在重新抛出的情况下,如果我计划用引用重新抛出,则第二个catch获取一个新变量,如果我在没有引用(即)值的情况下重新抛出,那么在中间抛出中完成的更改不会受到影响....

int goo() {
    throw 2;
}

int foo() {
   try{
      goo();
   } catch(int &i) { // (or) catch(int i) // i is not changing in the next line.
      i = 2;
      throw;
   }
}

int main() {
 try {
   foo();
 } catch (int &i) { 
   std::cout<<"ERROR, the value is "<<i<<std::endl;
 }
}
Run Code Online (Sandbox Code Playgroud)

OUTPUT:catch(int&i)//打印2 catch(int i)//打印1

根据我的判断,

我认为,只要它是引用,如果在中间步骤中它的'按值传递',则值会受到影响.它仍然将原始对象抛向第二个捕获.

(即)变量的控制流程实际上并没有抛出中间捕获.....

Mik*_*our 5

在这种情况下,这里会发生什么?创建一个新变量然后传递?

是; 当你抛出一个对象时,它会在某处创建,然后在处理完异常后(即在离开catch块而不重新抛出之后)销毁它.

如果我使用指针或没有引用的变量怎么办?也是在重新抛出的情况下......

如果按值捕获,那么您将获得该对象的副本 - 如果您重新抛出异常,则下一个处理程序将获得原始副本,并且不会看到您可能进行的任何更改.通过引用捕获将为您提供对抛出对象的引用 - 如果您重新抛出,则下一个处理程序看到您所做的任何更改.您无法通过指针捕获对象 - 如果抛出指针,您将只捕获指针.

此外,范围内声明或启动的所有变量是否已关闭?

抛出异常时,所有自动变量都会在throw所有封闭范围内被销毁,直到到达处理程序.动态分配的变量(例如你的new int[10])不会被删除,并且fclose当然不会为FILE*变量调用任意清理函数,除非它们由基于范围的对象(如智能指针)管理.