《Windows API每日一练》22.3 SHE异常

本节我们将讲述单线程到多线程的演进过程,以及进程与线程的区别。

本节必须掌握的知识点:

        SHE异常

        第170练:SEH异常处理程序

        第171练:setjmp和longjmp进行异常捕获与处理

22.3.1 SHE异常

在C语言中,Windows平台提供了结构化异常处理(Structured Exception Handling,SEH)机制,用于捕获和处理异常。SEH允许程序在发生异常时执行特定的异常处理代码,以实现异常安全和错误处理。

SEH使用以下两个主要的关键字/函数来实现异常处理:

__try:__try关键字用于标记一段代码块,该代码块可能会引发异常。在__try块中,可以包含可能引发异常的代码。

__except:__except关键字用于指定异常处理代码块,用于处理发生在__try块中的异常。在__except块中,可以编写处理异常的代码逻辑。

以下是使用SEH进行异常处理的基本结构:

__try {

    // 可能引发异常的代码块

    // ...

}

__except (ExceptionFilterFunction(GetExceptionCode(), GetExceptionInformation())) {

    // 异常处理代码块

    // ...

}

在上述代码结构中,__try块中的代码可能会引发异常。如果发生异常,控制流将转移到与__try块关联的__except块。__except块中的代码将处理异常,并根据需要执行适当的操作。

在__except块中,可以使用ExceptionFilterFunction来指定异常过滤函数,它接受异常代码和异常信息作为参数,并返回一个值用于指示如何处理异常。可以根据异常类型和其他条件来决定如何处理异常。

除了__try和__except之外,SEH还提供其他一些关键字和函数,如__finally和__leave,用于执行清理操作或控制控制流。

下面是一个简单的示例,演示了如何使用SEH处理除以零异常:

#include <stdio.h>

#include <windows.h>

int main() {

    __try {

        int dividend = 10;

        int divisor = 0;

        int result = dividend / divisor;  // 可能引发除以零异常

        printf("Result: %d\n", result);

    }

    __except (EXCEPTION_EXECUTE_HANDLER) {

        printf("Exception: Division by zero\n");

    }

    return 0;

}

【注意】SEH是特定于Windows平台的机制,在其他操作系统或编译器上可能没有直接的等效实现。此外,SEH处理的异常类型是系统定义的异常,如访问冲突、除以零等。对于C语言中的其他类型异常,可以使用C++异常处理机制(try-catch块)或其他库提供的异常处理机制。

22.3.2 第170练:SEH异常处理程序

/*------------------------------------------------------------------------

 170 WIN32 API 每日一练

     第170个例子seh01.c:SEH异常

(c) www.bcdaren.com 编程达人

-----------------------------------------------------------------------*/

#include <windows.h>

#include <stdio.h>

DWORD scratch;

//异常回调函数

int CALLBACK _Handler(PEXCEPTION_RECORD lpExceptionRecord, DWORD lpSEH,

    PCONTEXT lpContext,PVOID lpDispatcherContext)

{

    const TCHAR szMsg[] = TEXT("异常发生位置:%08X,异常代码:%08X,

标志:%08X");

    static TCHAR szBuffer[256];

    PCONTEXT

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值