基于异常的设计(1)

异常exception 是指在运行时刻程序出现的反情形,例如数组下标越界、打开文件失败以及可用动态内存耗尽等等。程序员一般有自己的处理异常的风格,这导致了不同的编码习惯,因而很难整合到一个单一的应用程序中。异常处理exception handling 为响应运行时刻的程序异常提供了一个标准的语言级的设施。它支持统一的语法和风格,也允许每个程序员进行微调。异常处理使得我们不需要在程序中处处显式地测试异常状态,从而可以将测试异常状态的代码抽取出来放入指定的显式标记的代码块中,因此异常处理设施大大地减少了程序代码的长度和复杂度。异常处理机制的主要构成如下 1 程序中异常出现的点。一旦识别出程序异常,就会导致抛出raise 或throw 异常。与异常被抛出时正常的程序就被挂起,直到异常被处理完毕。在C++中,异常的抛出由throw 表达式来执行。例如,在下面的程序段中一个string 类型的异常被抛出来,以便响应打开文件失败异常 if ( ! infile ) { string errMsg( "unable to open file: " ); errMsg += fileName; throw errMsg; } 2 程序中异常被处理的点。典型地程序异常的抛出与处理位于独立的函数或成员函数调用中找到。处理代码通常要涉及到展开程序调用栈Program call stack ,一旦异常被处理完毕就恢复正常的程序执行,但不是在发生异常的地方恢复执行过程而是在处理异常的地方恢复执行过程。C++中异常的处理由catch 子句来执行。例如下面的catch 子句处理在第1 项中被抛出的异常 catch( string exceptionMsg ) { log_message( exceptionMsg ); return false; } catch 子句与try 块相关联。一个try 块用一个或多个catch 子句将一条或多条语句组织起来。例如,下面是函数stats() 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; }

你可能感兴趣的:(C++,c,C#)