引发异常软件

某些编程错误的常见来源未标记为异常由系统。 例如,在中,如果尝试将内存块,但有足够的内存,运行时否则 API 函数会引发异常,而是返回错误代码。

但是,您可以将所有情况的异常通过检测代码中的条件然后报告通过调用 RaiseException 功能。 由标记的错误这样,您可以对任何运行时错误将结构化异常处理的优点。

使用结构化异常处理具有错误:

  • 定义拥有事件的异常代码。

  • ,当您检测一个问题后,调用 RaiseException

  • 测试使用异常处理的筛选器对于您定义的异常代码。

WINERROR.H 文件显示异常的编码格式。 若要,以确保不定义冲突与现有异常代码的代码,请将第三个最高有效位到 1。 应设置,如下表所示四最有效的位。

建议的二进制文件设置

说明

31-30

11

这两个描述代码的基本状态:11 = false, 00 = 成功, 01 = 信息性, 10 = 警告。

29

1

客户端位。 设置为 1 用户定义的代码。

28

0

保留的位。 (保留设置为 0。)

可以设置前两位设置为设置被 11 除二进制文件外,如果需要,不过,将 “错误”对于大多数异常是正确的。 需要注意的要点是设置如上表所示的位 29 和 28。

所以产生的错误代码应具有最高的四位设置为十六进制 E。 例如,下面的定义不冲突与任何窗口异常代码的异常代码。 (您可能,但是,需要检查第三方 DLL 使用哪些代码。)

#define STATUS_INSUFFICIENT_MEM       0xE0000001
#define STATUS_FILE_BAD_FORMAT        0xE0000002

在定义异常代码后,您可以使用将引发异常。 例如,下面的代码 STATUS_INSUFFICIENT_MEM 引发异常以响应内存分配问题:

lpstr = _malloc( nBufferSize );
if (lpstr == NULL)
    RaiseException( STATUS_INSUFFICIENT_MEM, 0, 0, 0);

如果要引发异常,可以设置前三个参数为 0。 三个最后一个参数为通过附加信息和设置阻止处理程序继续执行的标志很有用。 在参见 Windows SDK 的 RaiseException 功能有关更多信息。

在异常处理的筛选器,然后可以测试定义的代码。 例如:

__try {
    ...
}
__except (GetExceptionCode() == STATUS_INSUFFICIENT_MEM ||
        GetExceptionCode() == STATUS_FILE_BAD_FORMAT )

请参见

参考

编写异常处理程序

结构化异常处理(C++)