-------------------------------------------------------------------------------
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\n", 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!\n");
}
SetUnhandledExceptionFilter(pOldFilter); return rc;
} int main()
{
if (testxcpt())
printf("testxcpt() succeeded\n");
else
printf("testxcpt() failed\n");
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\n"
"ExceptionFlags = %08X\n"
"ContextFlags = %08X\n"
"SegGs = %08X\n"
"SegFs = %08X\n"
"SegEs = %08X\n"
"SegDs = %08X\n"
"Edi = %08X\n"
"Esi = %08X\n"
"Ebx = %08X\n"
"Edx = %08X\n"
"Ecx = %08X\n"
"Eax = %08X\n"
"Ebp = %08X\n"
"Eip = %08X\n"
"SegCs = %08X\n"
"EFlags = %08X\n"
"Esp = %08X\n"
"SegSs = %08X\n",
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\n", 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.\n");
}
__seh_end_except __seh_try
{
int *p=(int*)0x00001234;
*p=12;
}
__seh_except(ExceptionFilter(GetExceptionCodeSEH(), EXCEPTION_ACCESS_VIOLATION))
{
printf("Exception Caught.\n");
}
__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()\n");
int * pointer = NULL;
int i=0;
e4c_context_begin(E4C_TRUE);
try
{
printf("enter try\n");
int oops = *pointer;
}
catch(RuntimeException)
{
const e4c_exception * exception = e4c_get_exception();
printf("Exception Caught.\n");
if(exception)
{
printf( " exception->name %s\n"
" exception->message %s\n"
" exception->file %s\n"
" exception->line %ld\n"
" exception->function %s\n",
exception->name,
exception->message,
exception->file,
exception->line,
exception->function );
}
}
finally
{
printf("finally.\n");
}
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

mingw32 捕获异常的4种方法的更多相关文章

  1. 读取Excel文件的两种方法

    第一种方法:传统方法,采用OleDB读取EXCEL文件, 优点:写法简单,缺点:服务器必须安有此组件才能用,不推荐使用 private DataSet GetConnect_DataSet2(stri ...

  2. (转)Java结束线程的三种方法

    背景:面试过程中问到结束线程的方法和线程池shutdown shutdownnow区别以及底层的实现,当时答的并不好. Java结束线程的三种方法 线程属于一次性消耗品,在执行完run()方法之后线程 ...

  3. Java中终止线程的三种方法

    终止线程一般建议采用的方法是让线程自行结束,进入Dead(死亡)状态,就是执行完run()方法.即如果想要停止一个线程的执行,就要提供某种方式让线程能够自动结束run()方法的执行.比如设置一个标志来 ...

  4. Java结束线程的三种方法(爱奇艺面试)

    线程属于一次性消耗品,在执行完run()方法之后线程便会正常结束了,线程结束后便会销毁,不能再次start,只能重新建立新的线程对象,但有时run()方法是永远不会结束的.例如在程序中使用线程进行So ...

  5. Java结束线程的三种方法

    线程属于一次性消耗品,在执行完run()方法之后线程便会正常结束了,线程结束后便会销毁,不能再次start,只能重新建立新的线程对象,但有时run()方法是永远不会结束的.例如在程序中使用线程进行So ...

  6. Node.js模拟发起http请求从异步转同步的5种方法

    使用Node.js模拟发起http请求很常用的,但是由于Node模块(原生和第三方库)提供里面的方法都是异步,对于很多场景下应用很麻烦,不如同步来的方便.下面总结了几个常见的库API从异步转同步的几种 ...

  7. ASP.Net Core中处理异常的几种方法

    本文将介绍在ASP.Net Core中处理异常的几种方法 1使用开发人员异常页面(The developer exception page) 2配置HTTP错误代码页 Configuring stat ...

  8. JS 判断数据类型的三种方法

    说到数据类型,我们先理一下JavaScript中常见的几种数据类型: 基本类型:string,number,boolean 特殊类型:undefined,null 引用类型:Object,Functi ...

  9. DataTable 转换成 Json的3种方法

    在web开发中,我们可能会有这样的需求,为了便于前台的JS的处理,我们需要将查询出的数据源格式比如:List<T>.DataTable转换为Json格式.特别在使用Extjs框架的时候,A ...

随机推荐

  1. 设计模式——抽象工厂(Abstract Factory)

    Abstract Factory 抽象工厂模式(创建型模式): new的问题:实现依赖,不能应变应对“具体实例化类型”的变化. 解决思路:--封装变化点:哪里变化,封装哪里           - - ...

  2. python-实现生产者消费者模型

    生产者消费者:包子铺不停的做包子,行人不停的买 ---> 这样就达到了目的--->包子的销售 两个不同的角色 包子铺,行人 只负责单一操作 让包子变成连接的介质. #_*_coding:u ...

  3. java-工具类-读取配置文件

    java读取配置文件,当发现文件被修改后则重新加载 package com.zg.config; import java.io.File; import java.io.FileInputStream ...

  4. Linux--装好之后要做的几件事(转)

    1.删除libreoffice libreoffice虽然是开源的,但是Java写出来的office执行效率实在不敢恭维,装完系统后果断删掉 sudo apt-get remove libreoffi ...

  5. Python 从零学起(纯基础) 笔记 之 collection系列

    Collection系列  1.  计数器(Counter) Counter是对字典类型的补充,用于追踪值的出现次数   ps  具备字典所有功能 + 自己的功能 Counter import col ...

  6. python word

    代码: #coding=utf-8 __author__ = 'zhm' from win32com import client as wc import os import time import ...

  7. sublimetext调试

    Package Control Sublime Text提供了绝对必要的包管理器.这是安装下面列出的所有插件和主题的最佳方式.继续,在包控制在安装插件. 进入命令面板(ctrl + shift+ p) ...

  8. 【BZOJ-3747】Kinoman 线段树

    3747: [POI2015]Kinoman Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 715  Solved: 294[Submit][Stat ...

  9. linux管道命令grep命令参数及用法详解---附使用案例|grep

    功能说明:查找文件里符合条件的字符串. 语 法:grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>] ...

  10. Java框架--jQueryEasyUI

    111------------------------------------------------------------------------------------------------- ...