繁体   English   中英

在C ++中执行默认的catch throw语句传递值或引用

[英]do the default catch throw statements in C++ pass by value or reference

缺省catch语句catch(...) {}如何通过值或引用捕获异常?

其次,如何throw;违约throw; 通过价值或参考抛出异常?

catch-all catch (...)根本不能让你访问异常对象,所以这个问题没有实际意义。 [更正:] throw; 抛出原始对象。 如果处理程序按值捕获,则对本地副本的更改不会影响原始的重新抛出对象。 [/]详见15.3(特别是第17条)。

查看右侧的一些相关问题,例如这一个这个以及此一个此一个

你总能抓住你所抛出的东西。 假设您有一个异常类

 class MyException { public: int m_data; MyException(int data) { printf("MyException::MyException() ctor\\n"); m_data = data; } MyException(const MyException & other) { printf("MyException::MyException() copy ctor\\n"); } ~MyException() { printf("MyException::~MyException() dtor\\n"); } }; 

1)如果你抛出一个指针,你将获得指针:

例1:

 void f() { throw new MyException() } void main() { try{ f(); } catch(MyException * ex) // You WILL catch the pointer { delete ex; // You should delete the exception object } catch(MyException & ex) // You WILL NOT catch the pointer { } } 

例2:

 void main() { try{ f(); } catch(...) // You WILL catch the pointer, but will be unable to access it { throw; // You are rethrowing the pointer } } 

2)如果你抛出了一个对象,你会发现它的引用:

例1:

 void f() { printf("f BEGIN\\n"); throw MyException(1); // MyException ctor is called printf("f END\\n"); } void main() { printf("main BEGIN\\n"); try { f(); } catch(MyException & ex) // You WILL catch a reference to created object { printf("catch MyException: %d\\n", ex.m_data); } // MyException dtor is called here!! printf("main END\\n"); } 

生成以下输出:

main BEGIN
f BEGIN
MyException::MyException() ctor
catch MyException: 1
MyException::~MyException() dtor
main END

例2:

 void main() { try { f(); } catch(...) // You WILL catch a reference to created object, //but will be unable to access it { throw; // You throw the reference } } 

抛出将抛出的值复制到实现定义的位置。
因此,值会在throw上复制(这意味着该类型必须是可复制的)。

当你抓住时,你可以选择按价值或参考来捕捉。

catch(X  val) // Catch by value
{
}
catch(Y& val) // Catch by reference
{
}

惯用的原因是通过const引用来捕获。 这是因为如果按值捕获,则可以在将异常从其保存位置复制到catch值时进行切片。 如果按值捕获,则会在catch块的末尾销毁该值。 保存位置中的副本在try / catch块结束时被销毁(捕获(而不是重新抛出))。

因此,当你抓住catch(...)没有任何事情发生。 异常保留在未指定的位置,该异常已被复制到该异常中。

当您使用throw重新抛出异常时。 throw; 再次没有任何事情发生,因为异常已经在未指定的位置,并且不需要发生任何事情。

注意:打电话throw; 当没有异常传播是一个错误并将导致调用std :: terminate。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM