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 ...
随机推荐
- Jquery DIV滚动至浏览器顶部位置固定
获取元素(这里定位元素A)距离顶部的高度,接着设定scroll滚动的事件,比如超过那个高度,把A的位置设定为fixed,小于该高度,修改回relative. 方法一: $(function() { v ...
- js(jQuery)获取时间的方法及常用时间类
获取JavaScript 的时间使用内置的Date函数完成 var mydate = new Date();mydate.getYear(); //获取当前年份(2位)mydate.getFullYe ...
- 深入理解Java:String
在讲解String之前,我们先了解一下Java的内存结构. 一.Java内存模型 按照官方的说法:Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配. JVM主要管理两 ...
- LeetCode:3Sum, 3Sum Closest, 4Sum
3Sum Closest Given an array S of n integers, find three integers in S such that the sum is closest t ...
- 《Java EE 开发技术与案例教程》 这是一本好书啊:简洁精辟(相见恨晚)
第一章:Java EE 概述 1.get:JPA:Java Persistence API, 数据持久化API: JPA是一种ORM规范,它的实现实例:Hibernate.mybatis 2.Web ...
- maven 生成可执行的jar文件
微服务的热潮,慢慢讲jar引入了码农的视线之中,从传统web开发中过来的人面对这个东西也算是个新鲜事了,接下来聊一聊在maven下生成可运行jar的那些事. Maven可以使用mvn package指 ...
- Servlet和JSP学习指导与实践(三):JSP助阵
前言: JSP(Java Server Page)虽然作为一门服务端的语言,但它并没有创新新的语言标准.有些人一接触jsp之后发现易学易懂.实际上,jsp的内部原理仍然是基于Servlet,它是Ser ...
- 使用Swift打造动态库SDK和DemoAPP时所遇到的(Xcode7.3)
使用Swift开发SDK的优点是,生成的SDK对于Obj-C或是Swift调用都不需要自己去建桥接文件,因为Swift的SDK打包时默认已经自动生成供OC调用的.h文件.OC调用时直接import,s ...
- 数据结构作业——ギリギリ eye(贪心+优先队列/贪心+并查集)
ギリギリ eye Description A.D.1999,由坠落地球的“谜之战舰”带来的 Over Technology,揭示了人类历史和远古文明之间的丝丝联系, 促使人类终止彼此间的战争,一方面面 ...
- C#之字符串篇
大杂烩 一.类型转换 字符串转整形: int a = int.Parse(""); //不能转换null int b = Convert.ToInt32("&quo ...