可能重复:
在C++中通过指针捕获异常
我总是通过价值来捕捉异常.例如
try{
...
}
catch(CustomException e){
...
}
Run Code Online (Sandbox Code Playgroud)
但我遇到了一些相反的代码catch(CustomException &e).这是a)罚款b)错误c)灰色区域?
我发现有三种方法可以捕获异常,有什么区别?
1)按价值捕获;
2)引用参考;
3)用指针抓住;
我只知道按值捕获将调用该对象的两个副本,通过引用捕获将调用一个.那么指针捕获怎么样?什么时候用指针捕捉?除了抛出一个对象,我可以抛出一个像这样的对象的指针吗?
class A {}
void f() {
A *p = new A();
throw p;
}
Run Code Online (Sandbox Code Playgroud) 在下面的代码中,基于堆栈的变量"ex"被抛出并被捕获到超出声明ex的范围的函数中.这对我来说有点奇怪,因为(AFAIK)基于堆栈的变量不能在它们被声明的范围之外使用(堆栈被展开).
void f() {
SomeKindOfException ex(...);
throw ex;
}
void g() {
try {
f();
} catch (SomeKindOfException& ex) {
//Handling code...
}
}
Run Code Online (Sandbox Code Playgroud)
我已经向SomeKindOfException的析构函数添加了一个print语句,它显示ex在f()中超出范围后被破坏但是它在g()中被捕获并且一旦它超出范围就再次被破坏.
有帮助吗?