zoukankan      html  css  js  c++  java
  • mingw32 捕获异常的4种方法

    -------------------------------------------------------------------------------
    1. 利用 windows 的API SetUnhandledExceptionFilter
    -------------------------------------------------------------------------------
    #include <windows.h>
    #include <stdio.h>
    
    LONG WINAPI UnhandledExceptionFilter2(LPEXCEPTION_POINTERS pep)
    {
      int code =  pep->ExceptionRecord->ExceptionCode;
      int flags = pep->ExceptionRecord->ExceptionFlags;
      printf("Exception Caught: Code = %i, Flags = %i, Desc = %s
    ", code,
         flags, GetExceptionDescription(code));
      if (flags == EXCEPTION_NONCONTINUABLE)
      {
      MessageBox(NULL, "Cannot continue; that would only generate another exception!",
           "Exception Caught", MB_OK);
      return EXCEPTION_EXECUTE_HANDLER;
      }
      pep->ContextRecord->Eip -= 8;
      return EXCEPTION_CONTINUE_EXECUTION;
    }
    
    int testxcpt()
    {
      LPTOP_LEVEL_EXCEPTION_FILTER pOldFilter;
      char *s = NULL;
      int rc = FALSE;
    
      pOldFilter = SetUnhandledExceptionFilter(UnhandledExceptionFilter2);
      printf("Generate exception? y/n: ");
      fflush(stdin);
      switch(getchar())
      {
      case 'y':
      case 'Y':
      *s = *s;
      break;
      case 'n':
      case 'N':
      s = "s";
      rc = TRUE;
      break;
      default:
      printf("I said enter y or n!
    ");
      }
      SetUnhandledExceptionFilter(pOldFilter);
    
      return rc;
    }
    
    int main()
    {
      if (testxcpt())
      printf("testxcpt() succeeded
    ");
      else
      printf("testxcpt() failed
    ");
      return 0;
    }
    -------------------------------------------------------------------------------
    2. "excpt.h" - __try1
    -------------------------------------------------------------------------------
    #include <windows.h>
    #include <stdio.h>
    #include <excpt.h>
    
    char *GetExceptionDescription(LONG code);
    
    EXCEPTION_DISPOSITION MyHandler (struct _EXCEPTION_RECORD* er, void* buf, struct _CONTEXT* ctx, void* buf2)
    {
      printf("ExceptionCode  = %08X %s
    "
        "ExceptionFlags = %08X
    "
         "ContextFlags   = %08X
    "
         "SegGs  = %08X
    "
         "SegFs  = %08X
    "
         "SegEs  = %08X
    "
         "SegDs  = %08X
    "
         "Edi  = %08X
    "
         "Esi  = %08X
    "
         "Ebx  = %08X
    "
         "Edx  = %08X
    "
         "Ecx  = %08X
    "
         "Eax  = %08X
    "
         "Ebp  = %08X
    "
         "Eip  = %08X
    "
         "SegCs  = %08X
    "
         "EFlags = %08X
    "
         "Esp  = %08X
    "
         "SegSs  = %08X
    ",
         er->ExceptionCode,
         GetExceptionDescription(er->ExceptionCode),
         er->ExceptionFlags,
         ctx->ContextFlags,
         ctx->SegGs,
         ctx->SegFs,
         ctx->SegEs,
         ctx->SegDs,
         ctx->Edi,
         ctx->Esi,
         ctx->Ebx,
         ctx->Edx,
         ctx->Ecx,
         ctx->Eax,
         ctx->Ebp,
         ctx->Eip,
         ctx->SegCs,
         ctx->EFlags,
         ctx->Esp,
         ctx->SegSs
        );
      return ExceptionNestedException;
    }
    
    int main(void)
    {
      __try1(MyHandler)
      {
      int *p=(int*)0x00001234;
      *p=12;
      }
      __except1;
      {
      printf("Exception Caught");
      }
      return 0;
    }
    -------------------------------------------------------------------------------
    3. libseh
    -------------------------------------------------------------------------------
    LibSEH is a compatibility layer that allows one to utilize the Structured Exception Handling facility found in Windows within GNU C/C++ for Windows (MINGW32, CYGWIN). In other compilers, SEH is built into the compiler as a language extension. In other words, this syntax is not standard C or C++, where standard in this case includes any ANSI standard. Usually, support for this feature is implemented through __try, __except, and __finally compound statements.
    
    在 mingw32 中使用最好
    
    GetExceptionCode()  fix to -> GetExceptionCodeSEH()
    GetExceptionInformation() fix to -> GetExceptionInformationSEH()
    
    #include <windows.h>
    #include <stdio.h>
    
    /* The LibSEH header needs to be included */
    #include <seh.h>
    char *GetExceptionDescription(LONG code);
    
    int ExceptionFilter(unsigned int code, unsigned int excToFilter)
    {
      printf("ExceptionCode = %08X %s
    ", code, GetExceptionDescription(code) );
      if(code == excToFilter) return EXCEPTION_EXECUTE_HANDLER;
      else      return EXCEPTION_CONTINUE_SEARCH;
    }
    
    int main()
    {
      __seh_try
      {
      int x = 0;
      int y = 4;
      y /= x;
      }
      __seh_except(ExceptionFilter(GetExceptionCodeSEH(), EXCEPTION_INT_DIVIDE_BY_ZERO))
      {
      printf("Divide by zero exception.
    ");
      }
      __seh_end_except
    
      __seh_try
      {
      int *p=(int*)0x00001234;
      *p=12;
      }
      __seh_except(ExceptionFilter(GetExceptionCodeSEH(), EXCEPTION_ACCESS_VIOLATION))
      {
      printf("Exception Caught.
    ");
      }
      __seh_end_except
      
      return 0;
    }
    
    Note:
      http://www.programmingunlimited.net/siteexec/content.cgi?page=libseh
      http://www.programmingunlimited.net/files/libseh-0.0.4.zip
    -------------------------------------------------------------------------------
    4. exceptions4c
    -------------------------------------------------------------------------------
    exceptions4c is a tiny, portable framework that brings the power of exceptions to your C applications. It provides a simple set of keywords (macros, actually) which map the semantics of exception handling you're probably already used to: try, catch, finally, throw. You can write try/catch/finally blocks just as if you were coding in Java. This way you will never have to deal again with boring error codes, or check return values every time you call a function.
    
    If you are using threads in your program, you must enable the thread-safe version of the library by defining E4C_THREADSAFE at compiler level.
    
    The usage of the framework does not vary between single and multithreaded programs. The same semantics apply. The only caveat is that the behavior of signal handling is undefined in a multithreaded program so use this feature with caution.
    
    在 mingw32 中, 编译时需要加 -DE4C_THREADSAFE 参数
    
    #include <e4c.h>
    #include <stdio.h>
    
    int main(void)
    {
      printf("enter main()
    ");
      int * pointer = NULL;
      int i=0;
      e4c_context_begin(E4C_TRUE);
      try
      {
      printf("enter try
    ");
      int oops = *pointer;
      }
      catch(RuntimeException)
      {
      const e4c_exception * exception = e4c_get_exception();
      printf("Exception Caught.
    ");
      if(exception)
      {
        printf( "  exception->name       %s
    "
          "  exception->message    %s
    "
          "  exception->file       %s
    "
          "  exception->line       %ld
    "
          "  exception->function     %s
    ",
          exception->name,
          exception->message,
          exception->file,
          exception->line,
          exception->function );
      }
      }
      finally
      {
      printf("finally.
    ");
      }
      e4c_context_end();
      return 0;
    }
    
    Note:
      https://github.com/guillermocalvo/exceptions4c
      https://github.com/guillermocalvo/exceptions4c/archive/master.zip   <- 3.0.6
      https://github.com/guillermocalvo/exceptions4c/archive/v3.0.5.tar.gz
    
    libseh-0.0.4__exceptions4c-3.0.6.7z
  • 相关阅读:
    c# 图片保存为流Stream,再次加载时提示System.ArgumentOutOfRangeException: 要求非负数的解决办法
    VS 2019 Git failed with a fatal error的解决办法
    IIS安全狗卸载后,IIS8.5,网站无法访问的解决方法
    sqlserver 全文检索提高精确度的一个方法
    Win10应用商店打不开的解决办法
    Dapper解析嵌套的多层实体类
    Aspose.Words转换为PDF的时候字体丢失的问题解决
    IIS ASP.NET MVC 上传文件到NAS目录
    windows xp .net framework 4.0 HttpWebRequest 报The underlying connection was closed,基础连接已关闭
    c# 计算中文字节数与JAVA不符的解决方法
  • 原文地址:https://www.cnblogs.com/nlsoft/p/5794108.html
Copyright © 2011-2022 走看看