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
根据我的判断,
我认为,只要它是引用,如果在中间步骤中它的'按值传递',则值会受到影响.它仍然将原始对象抛向第二个捕获.
(即)变量的控制流程实际上并没有抛出中间捕获.....
在这种情况下,这里会发生什么?创建一个新变量然后传递?
是; 当你抛出一个对象时,它会在某处创建,然后在处理完异常后(即在离开catch块而不重新抛出之后)销毁它.
如果我使用指针或没有引用的变量怎么办?也是在重新抛出的情况下......
如果按值捕获,那么您将获得该对象的副本 - 如果您重新抛出异常,则下一个处理程序将获得原始副本,并且不会看到您可能进行的任何更改.通过引用捕获将为您提供对抛出对象的引用 - 如果您重新抛出,则下一个处理程序将看到您所做的任何更改.您无法通过指针捕获对象 - 如果抛出指针,您将只捕获指针.
此外,范围内声明或启动的所有变量是否已关闭?
抛出异常时,所有自动变量都会在throw所有封闭范围内被销毁,直到到达处理程序.动态分配的变量(例如你的new int[10])不会被删除,并且fclose当然不会为FILE*变量调用任意清理函数,除非它们由基于范围的对象(如智能指针)管理.
| 归档时间: |
|
| 查看次数: |
1443 次 |
| 最近记录: |