首先要要知道,结构化异常处理(SEH)和C++提供的异常处理不相同。

一.Termination Handlers
Termination Handlers使用很简单。在想使用SEH处理的地方使用
__try{/* [__leave;] */}
__finally{/* [AbnormalTermination] */}
即可。
SEH保证,无论__try中的代码怎样退出(正常执行完毕、retrun、goto、异常等等),都能保证__finally中的代码被执行。
1.在__try块之外的代码则没有这种特性。另外,TerminateThread或者TerminateProcess则使程序没有机会执行__finally里的代码;
2.如果__finally块中有return语句,那么将不会执行其他return语句;
3.因此应尽量少在__try块中放置return、goto等语句,在__finally语句中同样如此;
4.尽量使用__leave代替不可避免的return,__leave不会增加系统开销;
5.AbnormalTermination只用在__finally块中,如果是正常控制流进入__finally块,那么此函数返回FALSE,否则返回TRUE.
我们已经看到结束处理程序在补救t r y块中的过早退出的执行方面很有效,但也看到结束处理程序由于要阻止t r y块的过早退出而产生了我们不希望有的结果。更好的办法是在结束处理程序的t r y块中避免任何会引起过早退出的语句。实际上,最好将r e t u r n、c o n t i n u e、b r e a k、g o t o等语句从结束处理程序的t r y块和f i n a l l y块中移出去,放在结束处理程序的外面。这样做会使编译程序产生较小的代码,因为不需要再捕捉t r y块中的过早退出,也使编译程序产生更快的代码(因为执行局部展开的指令也少)。另外,代码也更容易阅读和维护。

二.Exception Handlers and Software Exceptions
__try{/* ... */}
__except(filter){/* ... */}

1.__except可以指定要过滤的条件,也可以是一个过滤函数。过滤函数返回3个异常之一;
2.与__finally不同的是,执行过__except块中的代码后,将继续执行该块之后的代码;
3.注意在与__except块配对的__try块中嵌套__finally时的情形(先执行所有__except块对应的__try块里的__finally,然后最终执行__except);
4.在__finally中写入return,可以阻止继续执行__except;
5.如果过滤函数返回EXCEPTION_CONTINUE_EXECTION,那么将不执行__except中的代码,而是返回到出现异常的代码,重新执行本条代码;
6.如果fliter是EXCEPTION_CONTINUE_SEARCH,那么本__except不处理该异常,继续像上层查找。如果所有的__except都没有处理EXCEPTION_EXECUTE_HANDLER,那么最终系统将调用UnhandledExceptionFilter,用来显示未处理异常的对话框,并让用户选择是否调试等等。如果用户选择了调试,那么UnhandledExceptionFilter就运行调试器进程,并附加本进程id作为参数,调试开始了;
7.fliter中可以通过GetExceptionCode获取异常的代码,这很有用滴.PS:不能再过滤函数里调用此函数哦;
8.可以通过调用GetExceptionInformation()能获取更详细的异常时信息,比如寄存器等等,同样,也只能在filter中调用;
9.通过调用RaiseException来触发一个软件异常。

三.C++异常和结构化异常
在VC++中,如果你使用了C++的try、catch等等,会自动被转化为SEH。例如,throw被转化为RaiseException,而catch则是__except。

posted on 2008-03-04 18:25  悠然小调  阅读(1379)  评论(0编辑  收藏  举报