lgxqf  

第二十四章 异常处理和软件异常

 

1.理解异常过虑器表达式

                __try

{//some code}

                __except(过虑器表达式)

{//code for exception handling}

 

2.过虑器表达式的值

                值只能为以下三种的一个

(1) EXCEPTION_EXECUTE_HANDLER

                                程序中遇到异常后,会立刻__except中的代码,然后接着__except块后的代码继续执行。

                (2) EXCEPTION_CONTINUE_EXECUTION

                                程序中遇到异常后,会立刻__except中的代码,然后跳回__try中发生异常的代码处,重新执行产生异常处的代码。

                (3) EXCEPTION_CONTINUE_SEARCH

                                程序中遇到异常后,__except中的代码不会被执行,而是寻常外层__try所对应的__except

 

3.举例

void FunclinRoosevelt2()

{

   TCHAR *pchBuffer = NULL;

 

   __try

   {

      FuncAtude2(pchBuffer);

   }

   __except (OilFilter2(&pchBuffer))

   {

      MessageBox(...);

   }

}

 

void FuncAtude2(TCHAR *sz)

{

   *sz = TEXT('"0');

}

 

LONG OilFilter2 (TCHAR **ppchBuffer)

{

   if (*ppchBuffer == NULL)

   {

      *ppchBuffer = g_szBuffer;

      return(EXCEPTION_CONTINUE_EXECUTION);

   }

   return(EXCEPTION_EXECUTE_HANDLER);

}

 

4. GetExceptionCode

              它返回一个DWORD值,该值用于分析程序产生异常的原因。

              DWORD Error 的内部结构

Bits

31–30

29

28

27–16

15–0

Contents

Severity

Microsoft/customer

Reserved

Facility code

Exception code

Meaning

0=Success 1=Informational

2=Warning

3=Error

0=Microsoftdefined code

1=customerdefined code

Must be 0

The first 256 values are reserved by Microsoft (See Table 24-3.)

Microsoft/customerdefined code

 

__try

{

   x=0;

   y = 4 / x; // y is used later so this statement is not optimized away

   ...

}

 

__except (

                            (GetExceptionCode() == EXCEPTION_INT_DIVIDE_BY_ZERO) ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH

)

{

   // Handle divide by zero exception.

}

 

4.SetUnhandledExceptionFilter

 

SetUnhandledExceptionFilter

       设置全局异常处理代码。若程序中的代码在执行时产生异常,且无相应的异常处理代码,

那么系统会自动调用用户设置的全局异常处理代码处理这些异常。

       C/C++程序在启动时,会自动安装一个异常处理函数UnhandledExceptionFilter

       注:SetUnhandledExceptionFilter(NULL),会重新把UnhandledExceptionFilter置为全局异常处理函数

 

5.举例

LONG WINAPI TopLevelUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo)

{

 

    printf("This is global handler set by SetUnhandledExceptionFilter"n");

 

 

    return 0?EXCEPTION_CONTINUE_EXECUTION :1?EXCEPTION_EXECUTE_HANDLER:EXCEPTION_CONTINUE_SEARCH;    

 

}

 

 

int main()

{

 

    SetUnhandledExceptionFilter(TopLevelUnhandledExceptionFilter);

 

    __try{

    int *p = NULL;

 

    *p = 0;}

 

    __except(EXCEPTION_EXECUTE_HANDLER)

    {

        printf(""nok");

    }

 

    printf("Recovered from exception handler"n");

 

    return 0;

   

}

 

6.Common API:

            RaiseException       GetExceptionInformation

posted on 2009-03-18 14:00  Justin_Ma  阅读(397)  评论(0编辑  收藏  举报