结构化异常处理(Structured Exception Handling,简称SEH)是Windows操作系统处理程序错误或异常技术。SEH是Windows操作系统的一种系统机制,与特定的程序设计语言无关。
Inter公司在从386开始的IA-32家族处理器中引入了中断(Interrupt)和异常(Exception)的概念。中断时由外部硬件设备或异步事件产生的。异常是由内部事件产生的,异常又可分为故障、陷阱和终止三类。故障和陷阱,正如其名所暗示的,是可恢复的;终止类异常是不可恢复的,如果发生了这种异常,系统必须重启。
所谓异常就是在应用程序的正常执行过程中发生的不正常的事件。CPU引发的异常称为硬件异常,例如访问一个无效的内存地址。操作系统或应用程序引发的异常称为软件异常。
中断类型号 | 类型 | 相关指令 |
0 | 除数为0中断 | DIV,IDIV |
1 | 调试异常 | 任何指令 |
3 | 断点中断 | INT3指令 |
4 | 溢出中断 | INTO |
5 | 边界检查 | BOUND |
6 | 非法指令故障 | 非法指令编码或操作数 |
7 | 设备不可用 | 浮点指令或WAIT |
8 | 双重故障 | 任何指令 |
0Ah | 无效TSS中断 | JMP、CALL、IRET、中断 |
0Bh | 段不存在异常 | 装载段寄存器 |
0Ch | 堆栈段异常 | 装载SS寄存器或SS段寄存器 |
0Dh | 通用保护异常 | 任何特权指令、任何访问存储器的指令 |
0Eh | 页异常 | 任何访问存储器的指令 |
除了CPU捕获一个事件并引发一个硬件异常外,在代码中可以强制引发一个软件异常。只需调用RaiseException函数:
void RaiseException(
DWORD dwExceptionCode, //标识所引发异常的代码
DWORD dwExceptionFlags, //异常继续是否执行的标识
DWORD nNumberOfArguments, //附加信息
const DWORD *lpArguments//附加信息
);
程序捕获软件异常的方法与捕获硬件异常的方法完全相同。