C++的异常处理机制为“响应运行时刻的程序异常”提供了一个标准的语言级设施。它支持统一的语法和风格,也允许程序员进行微调。
异常处理按需要在程序中显式的测试程序异常状态,从而可以将测试异常状态的代码抽取出来,放入指定的、显式标记的代码块中(try, catch)。
异常处理机制的主要构成
==============================================
1. 程序中异常出现的点
当异常被抛出时,正常的程序就被挂起,直到异常被处理完毕。
C++中,异常的抛出由throw表达式来执行。
例如在下面的程序段中一个string 类型的异常被抛出来以便响应打开文件失败异常
if ( ! infile ) { string errMsg( "unable to open file: " ); errMsg += fileName; throw errMsg; }
2. 程序中异常被处理的点
一般来说,程序异常的抛出和处理位于独立的函数或成员函数调用中。 一旦异常被处理完毕就恢复正常的程序执行。但不是在发生异常的地方恢复执行过程,而是在处理异常的地方继续执行过程。
C++中异常的处理由catch子句来执行。catch子句是与try块相关联的。 一个try块可能会对应多个catch子句,系统会根据被抛出的异常与catch子句中异常类型的匹配情况来选择catch子句。
int* stats( const int *ia, int size ) { int *pstats = new int[ 4 ]; try { pstats[ 0 ] = sum_it( ia, size ); pstats[ 1 ] = min_val( ia, size ); pstats[ 2 ] = max_val( ia, size ); } catch( string exceptionMsg ) { /* 处理异常的代码*/ } catch( const statsException &statsExcp ) { /* 处理异常的代码*/ } pstats[ 3 ] = pstats[ 0 ]/size; do_something( pstats ); return pstats; }
一种特殊的、能处理全部异常的catch子句如下:
catch( ... ) { // 处理所有异常,虽然它无法 // 访问异常对象 }
如果try块内抛出的异常不能被相关联的catch子句处理,那么当前函数将被终止。异常机制会继续在上层的函数中查找catch处理代码。如果一直找到main()函数还是没有找到合适的处理代码,那么程序将调用标准库函数terminate()来结束程序。