paip.提升用户体验---gccc++trycatch不能捕获异常的解决--使用SEHCa6
现象以及原因: 1
解决方法:使用SEH捕获异常: 1
可以使用SEH捕获的异常如下: 2
常见异常码(exceptioncode) 2
捕获系统异常原理: 2
其它捕获异常方法VEH,CRT 3
参考: 4
作者Attilax,EMAIL:1466519819@
来源:attilax的专栏
地址:/attilax
环境:xpsp3,ide是qtcreator2.8.1,,内建的编译器是gcc4.8(gcc.exe-v)
现象以及原因:
/
不能捕获"indexoutofrange",下标越界异常...经过测试,只能捕获手动throw出来的异常..使用windows的__try____except,,QT的QT_tryQT_catch都是不行....c++标准try,catch,throw是C++标准里的语法,标准只要求trycatch捕获throw出来的异常,并不要求捕获系统异常(如被0除,段错误,CPU异常等)。从C++层面来说,不要期望try,catch能捕获系统异常。
解决方法:使用SEH捕获异常:
///
调用操作系统提供的SEH异常处理流程走ok兰....代码比较多,参考:StructuredExceptionHandlingandMinGW这个文章...有源码下载.使用方法如下..
__seh_try{
puts("---pre");
QStringListli;
qDebug()<<li.at(1);
intn=5/0;
puts("---after");
}
__seh_except(info,context)
{
puts("catch.....ok");
qDebug()<<"info->ExceptionCode--"<<info->ExceptionCode;
qDebug()<<"--info->context--"<<context;
if(info->ExceptionCode==EXCEPTION_ACCESS_VIOLATION)
fputs("Accessviolationexceptionraised.\n",stderr);
}
__seh_end
可以使用SEH捕获的异常如下:
///
除0异常
访问一个不可用的内存地址(例如,NULL指针);
下标越界异常
其它异常等。
常见异常码(exceptioncode)
//
每一个SEH异常都有一个与其相关联的异常码(exceptioncode)
ERROR_NOACCESS(998)orEXCEPTION_ACCESS_VIOLATION(0xC0000005,0n3221225477)
EXCEPTION_INT_DIVIDE_BY_ZERO(0xC0000094,0n3221225620)
ERROR_STACK_OVERFLOW(1001)orEXCEPTION_STACK_OVERFLOW(0xC00000FD,0n3221225725)
C++exception(0xE06D7363,0n3765269347)
ERROR_DLL_INIT_FAILED(0x8007045A)
捕获系统异常原理:
这得益于硬件体系中的中断机制.简而言之,当发生整数除0之类的错误时,硬件会触发中断,这时操作系统会根据上下文查出是哪个进程不给力了,然后给这个进程发出一个信号.????这次就不是C++标准了,而是POSIX标准
异常处理过程,但毕竟是函数都会有调用栈,能返回.假如在handle_div_0中不调用exit自寻死路,而是选择返回,那么程序会怎么样呢?运行一下,当出现错误时,stderr会死循环般地刷屏.
????实际上,当错误发生时,操作系统会在当前错误出现处加载信号处理函数的调用栈帧,并且把它的返回地址设置为出错的那条指令之前,这样看起来就像是出错之前的瞬间调用了信号处理函数.当信号处理函数返回时,则又会再次执行那条会出错的指令,除非信号处理函数能通过某些特别的技巧修复指令,否则退出时会重蹈覆辙.
修复指令这种事情简直是天方夜谭,所以选择输出一跳错误语句并退出也算是不错的方法.在C语言时代,还可以通过setjmp和longjmp来跳转程序流程.不过setjmp和longjmp操作起来太不方便了,
其它捕获异常方法VEH,CRT
向量化异常处理(VectoredExceptionHandling)
向量化异常处理(VEH)是结构化异常处理的一个扩展,它在WindowsXP中被引入。
你可以使用AddVectoredExceptionHandler()函数添加一个向量化异常处理器,VEH的缺点是它只能用在WinXP及其以后的版本,因此需要在运行时检查AddVectoredExceptionHandler()函数是否存在。
除了SEH异常和C++类型化异常,C运行库(Cruntimelibraries,CRT)也提供它自己的错误处理机制,在你的程序中也应该考虑使用它。
C++信号处理C++SingalHandling
C++提供了被称为信号的中断机制。你可以使用signal()函数处理信号。
VisualC++提供了6中类型的信号:
lSIGABRTAbnormaltermination
lSIGFPEFloating-pointerror
lSIGILLIllegalinstruction
lSIGINTCTRL+Csignal
lSIGSEGVIllegalstorageaccess
lSIGTERM
获取异常信息RetrievingExceptionInformation汇编法
参考:
paip.c++gcc不能捕获exception异常的解决-attilax的专栏-博客频道-.htm
StructuredExceptionHandlingandMinGW-.htm
【翻译】异常和异常处理(windows平台)-进步一点点-博客园.htm
***44,347AddVectoredExceptionHandlerfunction(Windows).htm
***7,441c++exceptionerrorsehdemo.cpp
***18,848c++捕获所有异常的写法_空空软件_百度空间.htm
***102,936C++-MinGW能支持VC的__try的语法吗?-德问编程社交问答.htm
***46,332C++?中捕获整数除零错误_carlosstephen_新浪博客.htm
***130,760C++编译器无法捕捉到的8种错误-博客-伯乐在线.htm
顾问C语言的异常机制setjumplongjump函数【转】-红联Linux门户-中国领先的Linux技术网站-网站导航-Linux通用技术-Linux编程与内核.htm
***0f.txt
***74,315import【翻译】异常和异常处理(windows平台)-进步一点点-博客园.htm
***64,191Linux下C++异常处理技巧.htm
***OpenDiscussion_set_se_translator().htm
***445paip.提升用户体验-----注册全局异常处理器.txt
***310paip.提升用户体验-----注册全局异常处理器.txt.bak
***28,672paip.提升用户体验---gccc++trycatch不能捕获异常的解决--使用SEHCa6.wps
***3,440paip.提升用户体验---gccc++捕获windowsSEH异常的实现.txt
***3,420paip.提升用户体验---gccc++捕获windowsSEH异常的实现.txt.bak
***123,057ProblemFatalerroratthreadexitifFLScallbacknotfreed.htm
-09-2923:26223,823SEH异常,每个程序员都应当引起重视。-CSDN论坛-.htm
***22,516StructuredExceptionHandlingandMinGW-.htm
***77,215trycatch拦截不到异常啊???_百度知道.htm
***112,730undefinedreferencetoGCC遇到undefinedreferenceto错误的解决方法!-CC++-.htm
***44,750UsingaVectoredExceptionHandler(Windows).htm
-09-2921:3344,996[转载]Qt异常处理_yi_yuan_1988_新浪博客.htm
***kongbu0622)的专栏-博客频道-.htm
-09-2923:1974,921【翻译】异常和异常处理(windows平台)-进步一点点-博客园.htm
***25,235关于C++异常捕获的基本问题_百度知道.htm
***66,255结构化异常SEH转化为C++标准异常的简单实现.htm
***20,145编译错误:undefinereferenceto`qMain(int,char)'_GoldenTimes_百度空间.htm