SEH(Structured Exception Handling)是windows系统提供的异常处理机制。这种机制独立于编程语言。通常情况下,开发人员不需要直接调用Win32中原始的与SEH相关的API函数,而是通过特定语言的类库(比如MFC)间接地使用SEH,特定语言的编译器会把他们转换为windows操作系统中相关API函数的调用。
SEH的思想:当某个线程在执行过程中出现异常时,它回调一个事先准备好的函数。
同一个线程可以有多个回调函数,每个回调函数负责处理一种类型的异常、这些回掉函数首尾相接构成一个链表,链表的末端是windows操作系统提供的默认处理函数。
操作系统为每一个线程都维护一个和新对象,在核心对象中,有一个指针指向这个异常回调函数链表。如下图:
当发生异常时,操作系统找到发生异常线程的异常回调函数链表,然后依次调用链表中的每个函数,当某个函数可以处理此异常时,它向操作系统返回一个特殊的值,这时,操作系统不再调用链表中后面的回调函数。
如果发生异常的线程没有定义异常回调函数链表,操作系统就到创建此线程的父线程中去找,最后一直追踪到最顶层的线程(即进程中第一个线程)。
进程的第一个线程是一定有一个异常回调函数链表的,而且此链表必定至少有一个默认异常回调函数,因为这是操作系统在启动进程第一个线程时自动创建的。
这就意味着,如果某进程没有定义任何的异常处理代码,而它在执行过程中又发生了异常,那么由默认异常回调函数来收拾残局。默认异常回调函数完成的工作通常是两项:
(1)询问用户是否调试此进程 (2)终止整个进程
如果用户选择调试,则用户可以选择将一个调试器附加到此进程进行调试,否则,操作系统讲强行终止整个进程和它所创建的所有线程,并回收其资源。