本节我们将讲述单线程到多线程的演进过程,以及进程与线程的区别。
本节必须掌握的知识点:
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