600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > paip.提升用户体验---gcc c++ try catch不能捕获异常的解决--使用 SEH Ca6

paip.提升用户体验---gcc c++ try catch不能捕获异常的解决--使用 SEH Ca6

时间:2022-03-29 19:13:11

相关推荐

paip.提升用户体验---gcc c++ try catch不能捕获异常的解决--使用 SEH  Ca6

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。