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\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种方法的更多相关文章
- 读取Excel文件的两种方法
第一种方法:传统方法,采用OleDB读取EXCEL文件, 优点:写法简单,缺点:服务器必须安有此组件才能用,不推荐使用 private DataSet GetConnect_DataSet2(stri ...
- (转)Java结束线程的三种方法
背景:面试过程中问到结束线程的方法和线程池shutdown shutdownnow区别以及底层的实现,当时答的并不好. Java结束线程的三种方法 线程属于一次性消耗品,在执行完run()方法之后线程 ...
- Java中终止线程的三种方法
终止线程一般建议采用的方法是让线程自行结束,进入Dead(死亡)状态,就是执行完run()方法.即如果想要停止一个线程的执行,就要提供某种方式让线程能够自动结束run()方法的执行.比如设置一个标志来 ...
- Java结束线程的三种方法(爱奇艺面试)
线程属于一次性消耗品,在执行完run()方法之后线程便会正常结束了,线程结束后便会销毁,不能再次start,只能重新建立新的线程对象,但有时run()方法是永远不会结束的.例如在程序中使用线程进行So ...
- Java结束线程的三种方法
线程属于一次性消耗品,在执行完run()方法之后线程便会正常结束了,线程结束后便会销毁,不能再次start,只能重新建立新的线程对象,但有时run()方法是永远不会结束的.例如在程序中使用线程进行So ...
- Node.js模拟发起http请求从异步转同步的5种方法
使用Node.js模拟发起http请求很常用的,但是由于Node模块(原生和第三方库)提供里面的方法都是异步,对于很多场景下应用很麻烦,不如同步来的方便.下面总结了几个常见的库API从异步转同步的几种 ...
- ASP.Net Core中处理异常的几种方法
本文将介绍在ASP.Net Core中处理异常的几种方法 1使用开发人员异常页面(The developer exception page) 2配置HTTP错误代码页 Configuring stat ...
- JS 判断数据类型的三种方法
说到数据类型,我们先理一下JavaScript中常见的几种数据类型: 基本类型:string,number,boolean 特殊类型:undefined,null 引用类型:Object,Functi ...
- DataTable 转换成 Json的3种方法
在web开发中,我们可能会有这样的需求,为了便于前台的JS的处理,我们需要将查询出的数据源格式比如:List<T>.DataTable转换为Json格式.特别在使用Extjs框架的时候,A ...
随机推荐
- .Net配置中心-服务端/客户端
服务端 管理应用,一个应用对应一个站点. 管理应用下的配置. 在保存配置的时候,会更新应用的版本号. 客服端 其他站点引用DLL,并在Global的App_Start中调用ConfigCenter的I ...
- Windows phone应用开发[21]-图片性能优化
在windows phone 中常在列表中会常包含比较丰富文字和图片混排数据信息. 针对列表数据中除了谈到listbox等控件自身数据虚拟化问题外.虽然wp硬件设备随着SDK 8.0 发布得到应用可使 ...
- 延迟容忍网络(Delay-tolerant networking)
标签: 网络networking存储工作network路由器 2012-03-24 10:01 3702人阅读 评论(0) 收藏 举报 分类: 计算机网络(12) 版权声明:本文为博主原创文章,对文章 ...
- sFlow-RT
sFlow-RT™ incorporates InMon's asynchronous analytics technology (patent pending), delivering real-t ...
- Internet Download Manager 6.27.1 中文特别版(IDM)
软件介绍: 软件名称:Internet Download Manager(IDM) 软件大小:5.09M软件语言:简体中文 软件官网:http://www.internetdownloadmanage ...
- 解决:Linux版百度云客户端 BCloud网络错误 问题
国内很多云盘渐渐停止服务支持,如新浪.华为.115.360等... 强大的百度云,你会继续免费让大家使用吗? 今天在Linux上使用了liulang的BCloud百度云客户端,登陆之后不显示主页,什么 ...
- LinuxMint 18 编译cm13.0 笔记
1.安装依赖文件 sudo apt--dev libesd0-dev git-core gnupg flex bison gperf build-essential zip curl zlib1g-d ...
- SQL Server数据库常用函数
好久没学习新知识了.今天学了下sql的一些常用语句.人还是需要不断学习进步的 否则只能停滞不前. 先从最简单的一句开始说起吧. select *from 表名 这里*的含义 表示了表的各字段,以逗号隔 ...
- Photon服务器进阶&一个新游戏的出产(二)
继续上个文章说~ 接收其他人发过来的广播,在OnEvent中进行响应 比如说接收过来加入的消息 public void OnEvent(EventData eventData) { Debug.Log ...
- Javascript知识点记录(二)
Javascript入门易,精通难,基本上是共识的一个观点.在这个篇幅里,主要对一些难点进行记录. 鸭子类型 Javascript属于动态类型语言的一种.对变量类型的宽容,给了很大的灵活性.由于无需类 ...