1:如果使用普通的处理方式:ASSERT,return等已经
足够简洁明了,请不要使用异常处理机制.
2:可以通过异常处理简化程序结构.
A:如果if~else,用来排除异常时(注意不是一般条件判断时),如果出现多个if~else的嵌套从而影响了程序结构时,可以使用异常化处理.
3:c++中的try{}catch(...){},三个.代表所有的异常.(异常分不同的类型).
try
{
int *a;
a=(int *)0x00001;
*a=99;
}
catch(...)
{
AfxMessageBox("error");
}
4:throw,用来人为的 扔出一个异常.
5.比C的setjump,longjump优秀.
6.可以处理任意类型的异常.
你可以人为地抛出任何类型的对象作为异常.
throw 100;
throw "hello";
...
7.需要一定的开销,频繁执行的关键代码段避免使用
C++异常处理机制.
8.其强大的能力表现在:
A.把可能出现异常的代码和异常处理代码隔离开,结构更清晰.
B.把内层错误的处理直接转移到适当的外层来处理,化简了处理
流程.传统的手段是通过一层层返回错误码把错误处理转移到
上层,上层再转移到上上层,当层数过多时将需要非常多的判断,
以采取适当的策略.
C.局部出现异常时,在执行处理代码之前,会执行堆栈回退,即为
所有局部对象调用析构函数,保证局部对象行为良好.
D.可以在出现异常时保证不产生内存泄漏.通过适当的try,catch
布局,可以保证delete pobj;一定被执行.
E.在出现异常时,能够获取异常的信息,指出异常原因.
并可以给用户优雅的提示.
F.可以在处理块中尝试错误恢复.保证程序几乎不会崩溃.
通过适当处理,即使出现除0异常,内存访问违例,也能
让程序不崩溃,继续运行,这种能力在某些情况下及其重要.
9陷阱:派生类中的异常规范
在派生类中重定义或覆盖一个函数定义时,它应具有与基类中一亲友的异常规范,或至少应该在新的异常规范中给出基类异常规范的一个子集.换言之,重定义或覆盖一个函数定义时,不可在异常规范中添加新异常.但是,如果愿意,可删减基类中原有的异常.之所以有这个要求,是因为在能够使用基类对象的任何地方,都能使用一个派生类对象.因此,重定义或覆盖的函数必须兼容于为基类对象编写的任何代码.
10:assert 语句是在程序中进行错误检查的一种精简方式.
Assert语句在cassert库中定义,所以使用assert语句的任何程序都必须包含以下include预编译指令:
#include
Assert是一个宏(类似于函数的一种结构),所以有必要在一个库中定义它.
使用assert语句的一个好处是可以将其关闭.你可在自己的程序中用assert语句来高度程序,再将其关闭使用户看不到他们无法理解的错误消息.关闭assert语句,还能减少程序执行这些语句的开销.要关闭程序中的所有assert语句,请在include预编译指令之前添加#define NDEBUG,如下所示:
#define NDEBUG
#include
因此,如果在进行了全面高度的程序中插入#define NDEBUG
,就会关闭程序中的所有assert语句.如果以后改动了程序,可删除程序中的#define NDEBUG重新打开assert语句.