C++的异常处理

通过异常我们可以将问题的检测和解决分离,异常是通过抛出对象而引发的。类似以下形式:

try
{
	...
	throw(expection);
}
catch(expection)
{
	...
}

1、异常以类似于将实参传递给函数的方式抛出和捕获。

异常捕获(catch)时,如果抛出(throw)发生在被调用函数中,则此时该被调用函数中的局部存储都以释放,catch所处理的对象,是被抛出对象的副本,由throw表达式初始化,成为异常对象。该对象由编译器管理,驻留在可能被激活的任意catch都可以访问的空间。catch处理完后,该对象撤销。


2、一般而言,直接抛出一个指针不是一个好主意,因为在捕获时这个指针指向的对象可能已经被销毁,比如局部对象。


3、如果在抛出表达式中出现的是对指针的解引用,而且该指针属于基类指针指向派生类的情况,那么这个对象将被分割,只抛出基类部分。


4、发生throw后先匹配当前catch子句,匹配不上,则退出当前栈,在调用处匹配catch子句,以此类推,如果能匹配上,则执行该catch子句,然后紧接在该try块最后一个catch子句之后的点继续执行。catch匹配过程是最先匹配,而非最佳匹配,这意味着最特殊的catch必须最先出现。


5、在构造函数中也可能出现异常,如果是这样需要再异常处理中合理撤销已构造的那部分元素。


6、异常捕获的catch子句中的异常说明符通常需要时完全类型,因为接下来的代码通常需要访问该对象的成员。


7、异常类型与catch说明符之间的转换有如下规定:
允许转换:
    1)非const到const的转换;
    2)派生类到基类类型的转换;
    3)数组到数组指针的转换, 函数到函数指针的转换;
不允许转换:
    1)标准算数转换;
    2)类类型定义的转换;


8、catch可以通过重新抛出将异常传递到更上层去处理。重新抛出之需表达式throw,后面不跟类型或其他表达式。特别说明的是重新抛出的是异常就是原来的异常对象,而非catch的形参。一般而言,重新抛出前会对异常对象做一些处理,这是当前catch的形参需要是引用类型,因为对引用操作,才能改变外部那个异常对象。重新抛出后,更上层的catch继续处理已经过改变的异常对象。


9、由于不可能知道被抛出的所有异常,所以可能使用catch(...)子句来捕获所有异常。该子句经常用来完成可做的所有局部工作后,然后重新抛出异常。这是catch(...)单独使用的情况,如果是和其他catch子句并行使用,它必须是最后一个,否则所有在它后面的catch子句都不能被匹配。

你可能感兴趣的:(C++的异常处理)