文档介绍:第十一讲异常处理
异常的概念
说明: 在大型软件开发中,最大的问题就是错误与不稳定代码,而在设计一实现中,最大的开销是花在测试,查找和修改错误.
程序的错误,一种是编译错误,,它分为不可预料的逻辑错误和可以预料的运行异常.
逻辑错误是由于设计不当造成的,如某个排序算法不合适,导致在边界条件下,不能正常完成排序任务. ,就象大战之后残的地雷,当进入误区可能发生爆炸.
说明:运行异常可以预料,但不能避免,,打印机未打开,等,这些错误是能够预料的,可通过加入一些预防代码以防止这些异常.
如对文件打不开时的保护如下:
# include””
void f(chsr * str)
{ ifstream source(str);// 打开str串中的文件
if(()) //打不开文件
{ cerr<<”Error opening the file:”<<str<<endl;
exit(1); //退出程序
}}
异常是一种程序定义的错误;它对程序的逻辑错误进行设防,对运行异常加以控制。
C+十中,异常是对所能预料的运行错误进行处理的一套实现机制。
异常的的基本思想
在小型程序中。,从而无条件释放所有资源。对于大型程序来说,运行中一旦发生异常,应该允许恢复和继续运行。恢复的过程就是把产生异常所造成的恶劣影响去掉,中间可能要涉及一系列的函数调用链的退栈,对象的析构,资源的释放等。继续运行就是异常处理之后,在紧接着异常处理的代码区域中继续运行。在 C+十中,异常是指从发生问题的代码区域传递到处理问题的代码区域的一个对象
发生异常的地方在函数 k()中,处理异常的地方在其上层函数 f()中。处理异常后,函数k()和g()都退栈;然后程序在函数f()中继续运行。如果不用异常处理机制,。
异常的基本思想是:
(1)实际的资源分配(如内存申请或文件打开)通常在程序的低层进行,如图21-1中的k()。
(2)当操作失败、无法分配内存或无法打开一个文件时,在逻辑上如何进行处理通常是在程序的高层。如图 f(),中间还可能有与用户的对话。
(3)异常为从分配资源的代码转向处理错误状态的代码提供了一种表达方式。如果还
存在中间层次的函数,如图21-1中的g(),则为它们释放所分配的内存提供了机会。但这并不包括用于传递错误状态信息的代码。从中可以看出,C++异常处理的目的,是在异常发生时,尽可能地减小破坏,周密地善后;而不去影响其它部分程序的运行,这在大型程序中是非常必要的。
异常的实现
使用异常的步骤是:
(1)定义异常(try语句块)将那些有可能产生错误的语句框定在try块中;
(2)定义异常处理(catch语句块)将异常处理的语句放在Catch块中,以便异常被传
递过来时就处理它;
(3)抛掷异常(throw语句)检测是否产生异常,若是,则抛掷异常。
例如,下面的程序,设置了防备文件打不开的异常;
# include <>
# include <>
# include <>
void main(int argc, char * * argv)
{ ifstream source(argv[1]); //打开文件
char line [l28];
try
{ if (( )) throw argv[1];}
Catch (char *s)
{ cout << “error opening the file”<< s << endl;
exit(1 );
}
whli1e (! ())
{ (1ine,sizeof(1ine));
cout << line << endl;}
();}
,有xya,txt文件,;
C:\>
errpr Opening the file abc txt
c:\>
hello! //文件内容
How are you?
这里抛掷异常(throw argv[1])与处理异常(catch)在同一个函数中、当打开文件失败时,就执行”throw argv[1]”语句,throw后面的