天天看点

Structed Exception Handler 学习总结(三)

SEH的应用

Windows操作系统和C/C++编译器虽然对SHE(结果化异常处理)提供了很好的支持,但是Win32 API自身却并没有使用该机制来报告程序执行过程中出现的异常。

Win32 API对异常的处理是这样的:当有异常发生时,该API函数就会返回一些特定的值来表示函数调用失败了,这些值有,NULL, INVALID_HANDLE_VALUE, FALSE等,同时该API函数会使用SetLastError函数来设置一个基于线程的变量,该变量表示最近一次发生异常时的错误码,我们的程序在调用的API函数之后如果发现函数调用失败(即函数返回上述值)可以调用GetLastError来获得该错误码,通常这些错误码都是一些预定义的错误码(它们被定义在winerror.h文件中),所以我们可以通过该错误码获得一些与该异常相关的信息,利用这些信息来控制程序的执行流程。

所以,在进行win32编程时,我们常常会有这样的代码样式:

BOOL flag = Win32API();

    if(FALSE == flag)

    {

        switch(GetLastError())

        {

            case ERROR_CODE1:

                //......

                break;

            case ERROR_CODE2:

                //......

                break;

        }

    }

    else

    {

        //......

    }
           

我们看到,这样的代码中通常会有许多分支判断和跳转,它会损伤程序的性能,同时降低代码的可阅读性。如果我们使用SEH机制,则代码会变得很清爽,例如;

__try

{

//some my owner API call

}

__except(filter expression)

{

//exception handler

}
           

所以,SEH机制常常被用在第三方库中,或者我们自己编的应用时,也可以使用SEH来对底层的服务性API进行异常的抛出,这样我们在客户端代码中就可以使用try-except来处理异常了。

继续阅读