AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > C++

Win32下的结构异常

51自学网 http://www.51zixue.net

8.2 Win32下的结构异常
Win32支持与C++异常类似的基于C的结构异常处理。不过还是有一些关键的差别,当与C++代码混用时需要小心地使用。

在C++Builder应用程序中使用结构异常处理时需记住:
· C结构异常可在C++程序中使用。
· C++异常不能在C程序中使用,因为C++异常要求处理程序由catch关键字指定,而catch关键字在C程序中是不允许的。
· 一个由调用RaiseException函数生成的异常应在一个try/__except(C++)或__try/__except(C)块中处理(也可使用try/__finally或__try/__finally块。参见8.2.1节。当RaiseException函数调用时所有try/catch块中的处理程序都被忽略。
· 没有被应用程序处理的异常不会导致调用terminate(),而是被传递给操作系统(总的来说,最终结果是进程的结束)。
· 异常处理程序不接受异常对象的拷贝,除非它们请求如此。

可在C或C++程序中使用下列异常函数:
· GetExceptionCode。
· GetExceptionInformation。
· SetUnhandledExceptionFilter。
· UnhandledExceptionFilter。

C++Builder没有限制在__try/__except过滤器或try/__except块之外使用UnhandledExceptionFilter函数。但是,当这个函数在__try/__except过滤器或try/__except块之外调用时,程序行为不确定。

8.2.1 结构异常的语法
在C程序中,实现结构异常的ANSI兼容关键字为__except、__finally和__try。
注意 __try关键字仅能在C程序中使用。若想要编写可移植的代码,就不要在C++程序中使用结构异常处理。
try-except异常处理语法如下:


8.2.2 处理结构异常
结构异常可使用扩展的C++异常处理:


__expr__是值为表8-2中三值之一的一个表达式:


或者,若你在函数调用中比较喜欢使用逗号操作符实现嵌套,见下例:


8.2.3 异常过滤器
一个过滤器表达式可调用过滤器函数,但是过滤器函数不能调用GetExceptionInformation。可以把GetExceptionInformation的返回值作为一个参数传递给过滤器函数。为传递EXCEPTION_POINTERS信息到一个异常处理程序,过滤器表达式或过滤器函数必须从
GetExceptionInformation拷贝指针或数据到处理器以后可访问它的地方。

在嵌套的try-except语句中,每个语句的过滤器表达式都会被计算,直到它定位到EXCEPTION_EXECUTE_HANDLER或EXCEPTION_CONTINUE_EXECUTION。过滤器表达式能调用GetExceptionInformation以得到异常信息。只要GetExceptionInformation或GetExceptionCode直接在提供给__except的表达式中被调用,你可使用这个函数决定如何处理异常而非创建一个复杂的C++表达式。几乎所有处理异常需要的信息都能从GetExceptionInformation()的结果中提取。GetExceptionInformation()返回一指针到EXCEPTION_POINTERS结构:


EXCEPTION_RECORD包含与硬件无关的状态:


通常,过滤器函数在ExceptionRecord中搜索信息以决定如何响应。有时需要一些更特殊的信息(特别是操作为EXCEPTION_CONTINUE_EXECUTION:若没做任何事,引起异常的代码将再被执行)。对于这种状况,EXCEPTION_POINTERS结构中另外的字段提供异常发生时的处理器状态。如果这个结构被修改并且过滤器返回EXCEPTION_CONTINUE_EXCEPTION,它将被用来在执行继续前设置线程的状态。例如:

<

 

 

 
上一篇:C++和Object&nbsp;Pascal对象模型  下一篇:C++&nbsp;Builder&nbsp;调试多线程应用程序