kissfly
驱动小牛
驱动小牛
  • 注册日期2007-11-28
  • 最后登录2009-06-06
  • 粉丝0
  • 关注0
  • 积分41分
  • 威望310点
  • 贡献值1点
  • 好评度73点
  • 原创分2分
  • 专家分0分
阅读:1560回复:8

Windows Embedded的异常处理

楼主#
更多 发布于:2008-04-23 17:07
意外情况处理是强大的编程技术。强大的类型检查和确认是防止意外异常,确保文档记录及代码检查的有力工具。发现问题的杀伤力越早,这个问题就越容易解决。
相应一套的WIN32 API 起函数能容易的发现未预料到的错误状况,并且使之恢复。
结构化的意外情况处理,允许危险的段的代码可能由于硬件资源的问题、设备的冲突和微小的编码错误而导致失败,以使这部分程序与其余的应用程序分开。
在大多数32 位Windows平台上应用WIN32 API 的程序员在运用意外情况句柄的时候通常有两种选择,用C或 C++ 编写应用程序,并且利用WIN32提供的处理意外情况的宏,或者利用C++ 编写应用程序,并且使用C++ 语言定义的意外情况处理函数。
对于这种程序的编写,Windows CE的开发者因无法访问C++的(面向Windows CE的Visual C++ 目前还不支持意外情况处理,所以必须使用WIN32 API的意外情况处理宏。try 以及finally 宏,产生了使用意外情况句柄的所必要的底层代码。
定义异常宏:
1、Raise(type, msg):抛出type异常,msg为异常信息
2、RaiseMessage(msg):抛出异常,相当于Raise(EXCEPT_ALL, msg)
3、ReRaise():重新抛出以前的异常
4、异常响应。对可能出现的异常进行处理(无异常时,处理代码不执行):
* TRY *
* 正常代码 *
* ON_EXCEPT(type) *
* 可选项。处理type异常的代码,可在EXCEPT前连续使用 *
* EXCEPT *
* 可选项。所有异常处理代码,相当于ON_EXCEPT(EXCEPT_ALL)
* END_TRY *
5、异常保护。无论是否出现异常,均执行的保护性质代码,如资源释放:
* TRY *
* 正常代码 *
* FINALLY *
* 保护性质代码 *
* END_TRY *
6、套异常可嵌套使用,但不能混用,如:
* TRY *
* 代码块1 *
* TRY *
* 代码块2 *
* FINALLY *
* 保护性质代码 *
* END_TRY *
* EXCEPT *
* 异常处理代码 *
* END_TRY *
WIN32结构化意外情况处理宏是一种容易并且强大的保护应用程序使之免受未预料到的失败的方法。
/* 异常结构 */
typedef struct __Exception
{
int type; /* 异常类型 */
char *message; /* 消息 */
char *soufile; /* 源文件 */
int lineNum; /* 产生异常的行号 */
} Exception;
// 获取当前异常消息
char* except_Message(void);
// 获取当前异常结构
Exception *except_Exception(void);
// 以下函数为内部使用
void except_Set(void);
void except_Raise(int type, const char *message, char *file, int line);
void except_ReRaise(void);
int except_On(int type);
void except_end(void);
jmp_buf* except_Buf(void);
int except_SetNum(int Num);


最后,在处理异常的时候需要注意几点:
    外部数据是不可相信的,不管这些数据是来自寄存器、数据库、硬盘、socket,所书写的文件,它们都必须被广泛的检查。
    不要把重要的异常信息放在message中。
    每个线程需要一个单独的try/catch模块,否则,你将会丢失异常导致非常难处理的问题的出现。
    不要忘记应该经常性的记录Exception.ToString(),而不仅是Exception.Message。
    书写“catch(Exception ex)”时,尽量描述清楚OutOfMemoryException异常被抛出时,代码该如何处理。

kissfly
驱动小牛
驱动小牛
  • 注册日期2007-11-28
  • 最后登录2009-06-06
  • 粉丝0
  • 关注0
  • 积分41分
  • 威望310点
  • 贡献值1点
  • 好评度73点
  • 原创分2分
  • 专家分0分
沙发#
发布于:2008-04-23 17:07
给大家分享了!!
cctvsb
驱动牛犊
驱动牛犊
  • 注册日期2007-11-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分24分
  • 威望193点
  • 贡献值0点
  • 好评度43点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-04-24 18:37
Windows CE设备包括ROM和RAM内存?
kissfly
驱动小牛
驱动小牛
  • 注册日期2007-11-28
  • 最后登录2009-06-06
  • 粉丝0
  • 关注0
  • 积分41分
  • 威望310点
  • 贡献值1点
  • 好评度73点
  • 原创分2分
  • 专家分0分
地板#
发布于:2008-04-28 19:24
对。如果设备被关闭时,也可以通过使用后备电池而继续维持RAM中的内容。
cctvsb
驱动牛犊
驱动牛犊
  • 注册日期2007-11-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分24分
  • 威望193点
  • 贡献值0点
  • 好评度43点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2008-05-11 22:48
如果内层异常机制出现异常,没能够得到适当处理需要怎么办啊?
cctvsb
驱动牛犊
驱动牛犊
  • 注册日期2007-11-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分24分
  • 威望193点
  • 贡献值0点
  • 好评度43点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2008-05-11 22:49
楼主,我看了不少关于异常处理的方法,都说不要抛出new Exception(),是么?
kissfly
驱动小牛
驱动小牛
  • 注册日期2007-11-28
  • 最后登录2009-06-06
  • 粉丝0
  • 关注0
  • 积分41分
  • 威望310点
  • 贡献值1点
  • 好评度73点
  • 原创分2分
  • 专家分0分
6楼#
发布于:2008-05-11 22:50
引用第4楼cctvsb于2008-05-11 22:48发表的  :
如果内层异常机制出现异常,没能够得到适当处理需要怎么办啊?


只需将异常信息传递到上一层异常机制(重新抛出异常),并清除内层异常标志。
kissfly
驱动小牛
驱动小牛
  • 注册日期2007-11-28
  • 最后登录2009-06-06
  • 粉丝0
  • 关注0
  • 积分41分
  • 威望310点
  • 贡献值1点
  • 好评度73点
  • 原创分2分
  • 专家分0分
7楼#
发布于:2008-05-11 22:50
引用第5楼cctvsb于2008-05-11 22:49发表的  :
楼主,我看了不少关于异常处理的方法,都说不要抛出new Exception(),是么?

恩,Exception是一个非常大的类,如果没有side-effect,很难去捕获,也不要在需要时继承你自己的异常类。
kissfly
驱动小牛
驱动小牛
  • 注册日期2007-11-28
  • 最后登录2009-06-06
  • 粉丝0
  • 关注0
  • 积分41分
  • 威望310点
  • 贡献值1点
  • 好评度73点
  • 原创分2分
  • 专家分0分
8楼#
发布于:2008-05-11 22:50
多谢大家与我一起分享~
游客

返回顶部