+ -
当前位置:首页 → 问答吧 → RaiseException()的执行问题

RaiseException()的执行问题

时间:2011-11-23

来源:互联网

我用的是VS2005,在C++的代码中调用了这样的一个异常处理函数:
  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

作者: zgl7903   发布时间: 2011-11-23

楼上只解决了我的一个疑虑,就是RaiseException可以不打断程序的往下执行。
但还是没有解决我的问题。
如果是调试器(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楼的朋友,不过分不给你了,呵呵。

作者: muqiuyu1988   发布时间: 2011-11-25