try与throw用于抛出异常,catch用于捕获异常。在throw语句中,只能使用对象,而不要使用指针(尤其不要new 一个),如果使用了指针,那么原来的临时错误对象,在代码执行到外层函数时就撤销了,那么catch语句会捕获不到异常。对于catch语句而言,它会复制括号中的对象,因此使用引用时,会得到原异常对象。如果抛出的异常不能在本函数处理掉,那么,它会被外部函数处理,如果最终异常没有被处理,程序报错。catch语句的书写按照从特殊到普通的原则,最下的catch捕捉最常见的错误
在设计方法时,如果在函数声明后使用throw(...),此函数承诺会引发任何对象,如果使用throw(),则说明不会引发异常,如果使用throw(runtime_error),则说明只会引发实时错误。为了能够捕捉构造函数初始化列化中的错误,应该使用catch测试块:
CTest::CTest(int a,string str) try :m_a(a),m_str(str)
{
}
catch(...)
{
}
构造函数会引发异常,而析构函数一般不会,如果在构造函数中new了一个对象之后,delete这个对象之前,发生了异常,则这个动态对象无法清除,然面临时对象在发生异常时却可以撤销,因此使用可以把指针定义成临时对象的成员,那么在构造函数产生异常时,对象会自动撤销,那么指针也被清除。
希望能帮到你。 |