RaiseException()的执行问题
时间:2011-11-23
来源:互联网
我用的是VS2005,在C++的代码中调用了这样的一个异常处理函数:
RaiseException(EXCEPTION_ACCESS_VIOLATION,0,0,NULL);
但是一旦执行到这个函数,程序就崩溃了。
我看到网上有种说法是“(如果执行RaiseException后)该进程(即RaiseException所在的程序)仍未被调试,或者相关的调试器不处理异常,系统以异常类型为基础提供默认的处理程序。 对于大多数异常,默认动作是调用ExitProcess函数。”
基于这个结论,我猜想是不是VS2005的配置有问题,或者VS2005不支持这个异常处理?
还有,EXCEPTION_ACCESS_VIOLATION是个“可继续异常”,应该不会打断程序的执行啊。
将上述的情况综合考虑,我彻底混乱了,请哪位大侠给小弟支个招啊。
RaiseException(EXCEPTION_ACCESS_VIOLATION,0,0,NULL);
但是一旦执行到这个函数,程序就崩溃了。
我看到网上有种说法是“(如果执行RaiseException后)该进程(即RaiseException所在的程序)仍未被调试,或者相关的调试器不处理异常,系统以异常类型为基础提供默认的处理程序。 对于大多数异常,默认动作是调用ExitProcess函数。”
基于这个结论,我猜想是不是VS2005的配置有问题,或者VS2005不支持这个异常处理?
还有,EXCEPTION_ACCESS_VIOLATION是个“可继续异常”,应该不会打断程序的执行啊。
将上述的情况综合考虑,我彻底混乱了,请哪位大侠给小弟支个招啊。
作者: muqiuyu1988 发布时间: 2011-11-23
http://msdn.microsoft.com/zh-cn/site/ms681409
看example3
看example3
作者: zgl7903 发布时间: 2011-11-23
楼上只解决了我的一个疑虑,就是RaiseException可以不打断程序的往下执行。
但还是没有解决我的问题。
如果是调试器(VS2005)不处理这个异常导致程序终止,那么怎么可以让VS2005处理这个异常?或者有什么替代的方式?
再或者,有其他可能呢?哪位有经验的大侠给我讲解讲解啊,拜托啊
但还是没有解决我的问题。
如果是调试器(VS2005)不处理这个异常导致程序终止,那么怎么可以让VS2005处理这个异常?或者有什么替代的方式?
再或者,有其他可能呢?哪位有经验的大侠给我讲解讲解啊,拜托啊
作者: muqiuyu1988 发布时间: 2011-11-24
这个问题解决了。
为了给出现同样问题的朋友一些帮助,我解释下:
RaiseException(EXCEPTION_ACCESS_VIOLATION,0,0,NULL)这是个WIN API函数。用在SEH异常处理模型中。
SEH模型是windows系统中提供的,使用关键字:__try/__except()/__finally。与之相似的,C++标准也提供一个异常处理模型,使用关键字:try/throw/catch。其中throw和RaiseException作用相似,并且throw最终也是由RaiseException执行。
出现问题的原因就在于:“C++标准的异常处理模型不能处理内存访问异常”,如果你这么做了(用C++异常模型去处理内存访问异常),则程序直接崩溃。而RaiseException中使用参数EPTION_ACCESS_VIOLATION,作用就是处理内存访问异常,在我的代码中,RaiseException函数被放在try/catch结构中,所以程序直接崩溃。正确的应该使用__try/except(1).
最后同样感谢1楼的朋友,不过分不给你了,呵呵。
为了给出现同样问题的朋友一些帮助,我解释下:
RaiseException(EXCEPTION_ACCESS_VIOLATION,0,0,NULL)这是个WIN API函数。用在SEH异常处理模型中。
SEH模型是windows系统中提供的,使用关键字:__try/__except()/__finally。与之相似的,C++标准也提供一个异常处理模型,使用关键字:try/throw/catch。其中throw和RaiseException作用相似,并且throw最终也是由RaiseException执行。
出现问题的原因就在于:“C++标准的异常处理模型不能处理内存访问异常”,如果你这么做了(用C++异常模型去处理内存访问异常),则程序直接崩溃。而RaiseException中使用参数EPTION_ACCESS_VIOLATION,作用就是处理内存访问异常,在我的代码中,RaiseException函数被放在try/catch结构中,所以程序直接崩溃。正确的应该使用__try/except(1).
最后同样感谢1楼的朋友,不过分不给你了,呵呵。
作者: muqiuyu1988 发布时间: 2011-11-25
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28