Linux中国论坛's Archiver

freeskylin 发表于 2008-4-23 16:44

Windows Embedded的异常处理

[font=宋体]意外情况处理是强大的编程技术。强大的类型检查和确认是防止意外异常,确保文档记录及代码检查的有力工具。发现问题的杀伤力越早,这个问题就越容易解决。[/font][font=Arial][/font]
[font=宋体]相应一套的[/font][font=Arial]WIN32 API [/font][font=宋体]起函数能容易的发现未预料到的错误状况,并且使之恢复。[/font][font=Arial][/font]
[font=宋体]结构化的意外情况处理,允许危险的段的代码可能由于硬件资源的问题、设备的冲突和微小的编码错误而导致失败,以使这部分程序与其余的应用程序分开。[/font][font=Arial][/font]
[font=宋体]在大多数[/font][font=Arial]32 [/font][font=宋体]位[/font][font=Arial]Windows[/font][font=宋体]平台上应用[/font][font=Arial]WIN32 API [/font][font=宋体]的程序员在运用意外情况句柄的时候通常有两种选择,用[/font][font=Arial]C[/font][font=宋体]或[/font][font=Arial] C++ [/font][font=宋体]编写应用程序,并且利用[/font][font=Arial]WIN32[/font][font=宋体]提供的处理意外情况的宏,或者利用[/font][font=Arial]C++ [/font][font=宋体]编写应用程序,并且使用[/font][font=Arial]C++ [/font][font=宋体]语言定义的意外情况处理函数。[/font][font=Arial][/font]
[font=宋体]对于这种程序的编写,[/font][font=Arial]Windows CE[/font][font=宋体]的开发者因无法访问[/font][font=Arial]C++[/font][font=宋体]的(面向[/font][font=Arial]Windows CE[/font][font=宋体]的[/font][font=Arial]Visual C++ [/font][font=宋体]目前还不支持意外情况处理,所以必须使用[/font][font=Arial]WIN32 API[/font][font=宋体]的意外情况处理宏。[/font][font=Arial]try [/font][font=宋体]以及[/font][font=Arial]finally [/font][font=宋体]宏,产生了使用意外情况句柄的所必要的底层代码。[/font][font=Arial][/font]
[font=宋体]定义异常宏:[/font][font=Arial][/font]
[font=Arial]1[/font][font=宋体]、[/font][font=Arial]Raise(type, msg)[/font][font=宋体]:抛出[/font][font=Arial]type[/font][font=宋体]异常,[/font][font=Arial]msg[/font][font=宋体]为异常信息[/font][font=Arial] [/font]
[font=Arial]2[/font][font=宋体]、[/font][font=Arial]RaiseMessage(msg)[/font][font=宋体]:抛出异常,相当于[/font][font=Arial]Raise(EXCEPT_ALL, msg) [/font]
[font=Arial]3[/font][font=宋体]、[/font][font=Arial]ReRaise()[/font][font=宋体]:重新抛出以前的异常[/font][font=Arial] [/font]
[font=Arial]4[/font][font=宋体]、异常响应。对可能出现的异常进行处理[/font][font=Arial]([/font][font=宋体]无异常时,处理代码不执行[/font][font=Arial])[/font][font=宋体]:[/font][font=Arial][/font]
[table=559][tr][td=1,1,559][align=left][align=left][font=Arial][size=9pt]* TRY *[/size][/font][/align][/align][/td][/tr][tr][td=1,1,559][align=left][align=left][font=Arial][size=9pt]* [/size][/font][font=宋体][size=9pt]正常代码[/size][/font][font=Arial][size=9pt] *[/size][/font][/align][/align][/td][/tr][tr][td=1,1,559][align=left][align=left][font=Arial][size=9pt]* ON_EXCEPT(type) *[/size][/font][/align][/align][/td][/tr][tr][td=1,1,559][align=left][align=left][font=Arial][size=9pt]* [/size][/font][font=宋体][size=9pt]可选项。处理[/size][/font][font=Arial][size=9pt]type[/size][/font][font=宋体][size=9pt]异常的代码,可在[/size][/font][font=Arial][size=9pt]EXCEPT[/size][/font][font=宋体][size=9pt]前连续使用[/size][/font][font=Arial][size=9pt] *[/size][/font][/align][/align][/td][/tr][tr][td=1,1,559][align=left][align=left][font=Arial][size=9pt]* EXCEPT *[/size][/font][/align][/align][/td][/tr][tr][td=1,1,559][align=left][align=left][font=Arial][size=9pt]* [/size][/font][font=宋体][size=9pt]可选项。所有异常处理代码,相当于[/size][/font][font=Arial][size=9pt]ON_EXCEPT(EXCEPT_ALL) [/size][/font][/align][/align][/td][/tr][tr][td=1,1,559][align=left][align=left][font=Arial][size=9pt]* END_TRY *[/size][/font][/align][/align][/td][/tr][/table][font=Arial]5[/font][font=宋体]、异常保护。无论是否出现异常,均执行的保护性质代码,如资源释放:[/font][font=Arial][/font]
[table=529][tr][td=1,1,529][align=left][align=left][font=Arial][size=9pt]* TRY *[/size][/font][/align][/align][/td][/tr][tr][td=1,1,529][align=left][align=left][font=Arial][size=9pt]* [/size][/font][font=宋体][size=9pt]正常代码[/size][/font][font=Arial][size=9pt] *[/size][/font][/align][/align][/td][/tr][tr][td=1,1,529][align=left][align=left][font=Arial][size=9pt]* FINALLY *[/size][/font][/align][/align][/td][/tr][tr][td=1,1,529][align=left][align=left][font=Arial][size=9pt]* [/size][/font][font=宋体][size=9pt]保护性质代码[/size][/font][font=Arial][size=9pt] *[/size][/font][/align][/align][/td][/tr][tr][td=1,1,529][align=left][align=left][font=Arial][size=9pt]* END_TRY *[/size][/font][/align][/align][/td][/tr][/table][font=Arial]6[/font][font=宋体]、套异常可嵌套使用,但不能混用,如:[/font][font=Arial][/font]
[table=511][tr][td=1,1,511][align=left][align=left][font=Arial][size=9pt]* TRY *[/size][/font][/align][/align][/td][/tr][tr][td=1,1,511][align=left][align=left][font=Arial][size=9pt]* [/size][/font][font=宋体][size=9pt]代码块[/size][/font][font=Arial][size=9pt]1 *[/size][/font][/align][/align][/td][/tr][tr][td=1,1,511][align=left][align=left][font=Arial][size=9pt]* TRY *[/size][/font][/align][/align][/td][/tr][tr][td=1,1,511][align=left][align=left][font=Arial][size=9pt]* [/size][/font][font=宋体][size=9pt]代码块[/size][/font][font=Arial][size=9pt]2 *[/size][/font][/align][/align][/td][/tr][tr][td=1,1,511][align=left][align=left][font=Arial][size=9pt]* FINALLY *[/size][/font][/align][/align][/td][/tr][tr][td=1,1,511][align=left][align=left][font=Arial][size=9pt]* [/size][/font][font=宋体][size=9pt]保护性质代码[/size][/font][font=Arial][size=9pt] *[/size][/font][/align][/align][/td][/tr][tr][td=1,1,511][align=left][align=left][font=Arial][size=9pt]* END_TRY *[/size][/font][/align][/align][/td][/tr][tr][td=1,1,511][align=left][align=left][font=Arial][size=9pt]* EXCEPT *[/size][/font][/align][/align][/td][/tr][tr][td=1,1,511][align=left][align=left][font=Arial][size=9pt]* [/size][/font][font=宋体][size=9pt]异常处理代码[/size][/font][font=Arial][size=9pt] *[/size][/font][/align][/align][/td][/tr][tr][td=1,1,511][align=left][align=left][font=Arial][size=9pt]* END_TRY *[/size][/font][/align][/align][/td][/tr][/table][font=Arial]WIN32[/font][font=宋体]结构化意外情况处理宏是一种容易并且强大的保护应用程序使之免受未预料到的失败的方法。[/font][font=Arial][/font]
[table=364][tr][td=1,1,364][align=left][align=left][font=Arial][size=9pt]/* [/size][/font][font=宋体][size=9pt]异常结构[/size][/font][font=Arial][size=9pt] */[/size][/font][/align][/align][/td][/tr][tr][td=1,1,364][align=left][align=left][font=Arial][size=9pt]typedef struct __Exception[/size][/font][/align][/align][/td][/tr][tr][td=1,1,364][align=left][align=left][font=Arial][size=9pt]{[/size][/font][/align][/align][/td][/tr][tr][td=1,1,364][align=left][align=left][font=Arial][size=9pt]int type; [/size][/font][font=Arial][size=9pt]/* [/size][/font][font=宋体][size=9pt]异常类型[/size][/font][font=Arial][size=9pt] */[/size][/font][font=Arial][size=9pt][/size][/font][/align][/align][/td][/tr][tr][td=1,1,364][align=left][align=left][font=Arial][size=9pt]char *message; [/size][/font][font=Arial][size=9pt]/* [/size][/font][font=宋体][size=9pt]消息[/size][/font][font=Arial][size=9pt] */[/size][/font][font=Arial][size=9pt][/size][/font][/align][/align][/td][/tr][tr][td=1,1,364][align=left][align=left][font=Arial][size=9pt]char *soufile; [/size][/font][font=Arial][size=9pt]/* [/size][/font][font=宋体][size=9pt]源文件[/size][/font][font=Arial][size=9pt] */[/size][/font][font=Arial][size=9pt][/size][/font][/align][/align][/td][/tr][tr][td=1,1,364][align=left][align=left][font=Arial][size=9pt]int lineNum; [/size][/font][font=Arial][size=9pt]/* [/size][/font][font=宋体][size=9pt]产生异常的行号[/size][/font][font=Arial][size=9pt] */[/size][/font][font=Arial][size=9pt][/size][/font][/align][/align][/td][/tr][tr][td=1,1,364][align=left][align=left][font=Arial][size=9pt]} Exception;[/size][/font][/align][/align][/td][/tr][tr][td=1,1,364][align=left][align=left][font=Arial][size=9pt]// [/size][/font][font=宋体][size=9pt]获取当前异常消息[/size][/font][font=Arial][size=9pt][/size][/font][/align][/align][/td][/tr][tr][td=1,1,364][align=left][align=left][font=Arial][size=9pt]char* except_Message(void);[/size][/font][/align][/align][/td][/tr][tr][td=1,1,364][align=left][align=left][font=Arial][size=9pt]// [/size][/font][font=宋体][size=9pt]获取当前异常结构[/size][/font][font=Arial][size=9pt][/size][/font][/align][/align][/td][/tr][tr][td=1,1,364][align=left][align=left][font=Arial][size=9pt]Exception *except_Exception(void);[/size][/font][/align][/align][/td][/tr][tr][td=1,1,364][align=left][align=left][font=Arial][size=9pt]// [/size][/font][font=宋体][size=9pt]以下函数为内部使用[/size][/font][font=Arial][size=9pt][/size][/font][/align][/align][/td][/tr][tr][td=1,1,364][align=left][align=left][font=Arial][size=9pt]void except_Set(void);[/size][/font][/align][/align][/td][/tr][tr][td=1,1,364][align=left][align=left][font=Arial][size=9pt]void except_Raise(int type, const char *message, char *file, int line);[/size][/font][/align][/align][/td][/tr][tr][td=1,1,364][align=left][align=left][font=Arial][size=9pt]void except_ReRaise(void);[/size][/font][/align][/align][/td][/tr][tr][td=1,1,364][align=left][align=left][font=Arial][size=9pt]int except_On(int type);[/size][/font][/align][/align][/td][/tr][tr][td=1,1,364][align=left][align=left][font=Arial][size=9pt]void except_end(void);[/size][/font][/align][/align][/td][/tr][tr][td=1,1,364][align=left][align=left][font=Arial][size=9pt]jmp_buf* except_Buf(void);[/size][/font][/align][/align][/td][/tr][tr][td=1,1,364][align=left][align=left][font=Arial][size=9pt]int except_SetNum(int Num); [/size][/font][font=宋体][size=8pt]窗体底端[/size][/font][font=Arial][size=9pt][/size][/font][/align][/align][/td][/tr][/table][font=Arial] [/font]
[font=宋体]最后,在处理异常的时候需要注意几点:[/font][font=Arial][/font]
[font=Wingdings]Ø
[/font][font=宋体]外部数据是不可相信的,不管这些数据是来自寄存器、数据库、硬盘、[/font][font=Arial]socket[/font][font=宋体],所书写的文件,它们都必须被广泛的检查。[/font][font=Arial][/font]
[font=Wingdings][b]Ø
[/b][/font][font=宋体][b]不要把重要的异常信息放在[/b][/font][font=Arial][b]message[/b][/font][font=宋体][b]中。[/b][/font][font=Arial][b][/b][/font]
[font=Wingdings]Ø
[/font][font=宋体]每个线程需要一个单独的[/font][font=Arial]try/catch[/font][font=宋体]模块,否则,你将会丢失异常导致非常难处理的问题的出现。[/font][font=Arial][/font]
[font=Wingdings]Ø
[/font][font=宋体]不要忘记应该经常性的记录[/font][font=Arial]Exception.ToString()[/font][font=宋体],而不仅是[/font][font=Arial]Exception.Message[/font][font=宋体]。[/font][font=Arial][/font]
[font=Wingdings][size=10.5pt]Ø
[/size][/font][font=宋体]书写[/font][font=Arial]“catch(Exception ex)”[/font][font=宋体]时,尽量描述清楚[/font][font=Arial]OutOfMemoryException[/font][font=宋体]异常被抛出时,代码该如何处理。[/font][font=Arial][size=10.5pt][/size][/font]

freeskylin 发表于 2008-4-23 16:45

最新一篇 希望大家支持我哦

欣喜 发表于 2008-4-24 18:49

Windows CE设备包括ROM和RAM内存?

freeskylin 发表于 2008-4-25 17:17

对。如果设备被关闭时,也可以通过使用后备电池而继续维持RAM中的内容。

小漏 发表于 2008-5-12 00:35

是不是不能用catch(){}?

小漏 发表于 2008-5-12 00:36

楼主,我看了不少关于异常处理的方法,都说不要抛出new Exception(),是么?

freeskylin 发表于 2008-5-12 00:37

[quote]原帖由 [i]小漏[/i] 于 2008-5-12 00:35 发表 [url=http://bbs.linux-cn.com/redirect.php?goto=findpost&pid=45896&ptid=16126][img]http://bbs.linux-cn.com/images/common/back.gif[/img][/url]
是不是不能用catch(){}? [/quote]

[font=宋体]不是不能用,而是[/font][font=宋体]要尽量避免捕获异常而不返回,否则是错误使用[/font][font=宋体]。[/font][size=10.5pt][/size]

freeskylin 发表于 2008-5-12 00:38

[quote]原帖由 [i]小漏[/i] 于 2008-5-12 00:36 发表 [url=http://bbs.linux-cn.com/redirect.php?goto=findpost&pid=45897&ptid=16126][img]http://bbs.linux-cn.com/images/common/back.gif[/img][/url]
楼主,我看了不少关于异常处理的方法,都说不要抛出new Exception(),是么? [/quote]

[font=宋体][size=10.5pt]恩,[/size][/font][size=10.5pt]Exception[/size][font=宋体][size=10.5pt]是一个非常大的类,如果没有[/size][/font][size=10.5pt]side-effect[/size][font=宋体][size=10.5pt],很难去捕获,也不要在需要时继承你自己的异常类。[/size][/font]

freeskylin 发表于 2008-5-12 00:39

多谢大家与我一起分享~:loveliness:

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.