异常处理

本文详细介绍了Windows平台下的结构化异常处理(SEH)及其使用方法,包括__try、__except、__finally等关键字的应用,并探讨了SEH与C++异常之间的关系。此外,还讨论了异常过滤器表达式及全局异常处理。
1.结构化异常处理
SEH是由编译器实现的,不同编译器在实现SEH时会有些区别。它是Winodws特有的技术。
SEHC++异常是两种不同的异常机制。在VCC++异常是基于SEH实现的。
2.结构化异常处理用法
(1)__try
   __try后必须接__finally__except中的一个,且只能有一个。
   __try中有return,break,continue等语句,在执行这些语句前,系统会先调用__finally中的代码然后再跳回到return,break,continue继续执行。
   __try中有ExitThread,ExitProcess等语句,线程或程会立刻退出而不会执行__finally中的代码。
(2)__leave
    __try中有__leave,代码会从该处跳到__try的未端,直接执行__finally中的代码,然后继续向下执行,而不会跳回到原处。
    建议将程序中的return,break,continue等语句换成__leave
(3)__finally
     它不会处理程序中的异常,但会处理程序中的goto,break,continue,return等语句。
AbnormalTermination()函数只能在__finally块中用,它用于判断程序是因顺序执行到__finally处,还是因return,goto等语句跳到__finally处。
(4)__except
      只有当__try块中的代码产生异常时,__except中的代码才会执行。
      若程序中有异常且无__except,那么程序会异常退出。
­
异常处理和软件异常
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 的内部结构
__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

转载于:https://www.cnblogs.com/dubingsky/archive/2009/06/17/1504914.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值