在前面几篇文章中,我们介绍了VC++结构化异常处理的相关内容,目前其用途仅限于捕获代码中本来就存在的异常,比如访问违规、除数为0等异常情况。其实在很多场合,我们也完全可以利用这种机制,触发一个异常,然后让执行流程转入异常处理阶段。
一个最典型的例子是Windows中用于创建堆和分配堆内存的HeapCreate和HeapAlloc等函数,如果在其传入的dwFlags中加入了HEAP_GENERATE_EXCEPTIONS标记,则当分配或创建失败后,这些函数不再如其他WinAPI一样通过返回值体现,而是会直接抛出异常。这时,调用它们的代码也不必每调用一个API就检查返回值,而是在try块中写正常调用的执行流程,而在except块中写异常处理的代码。这样省略了之前每个WinAPI后面的if判断是否成功的语句,而将其集中到except中,使得程序的正常执行流程变得更加简单。这种由我们自己抛出的异常,称为“软件异常”。
在Win32API中,使用RaiseException函数抛出一个异常。其原型如下:
void WINAPI RaiseException(
__in DWORD dwExceptionCode,
__in DWORD dwExceptionFlags,
__in DWORD nNumberOfArguments,
__in const ULONG_PTR *lpArguments );
其中,</