如何处理AccessViolationException

我正在从.net应用程序中使用COM对象(MODI)。我正在调用的方法将引发System.AccessViolationException,它会被Visual

Studio拦截。奇怪的是,我将调用包裹在一个try捕获中,该捕获具有用于AccessViolationException,COMException和其他所有内容的处理程序,但是当Visual

Studio(2010)拦截AccessViolationException时,调试器会中断方法调用(doc.OCR),如果我单步执行,它将继续到下一行而不是进入catch块。另外,如果我在Visual

Studio之外运行此程序,则应用程序将崩溃。如何处理COM对象中引发的异常?

MODI.Document doc = new MODI.Document();

try

{

doc.Create(sFileName);

try

{

doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, false, false);

sText = doc.Images[0].Layout.Text;

}

catch (System.AccessViolationException ex)

{

//MODI seems to get access violations for some reason, but is still able to return the OCR text.

sText = doc.Images[0].Layout.Text;

}

catch (System.Runtime.InteropServices.COMException ex)

{

//if no text exists, the engine throws an exception.

sText = "";

}

catch

{

sText = "";

}

if (sText != null)

{

sText = sText.Trim();

}

}

finally

{

doc.Close(false);

//Cleanup routine, this is how we are able to delete files used by MODI.

System.Runtime.InteropServices.Marshal.FinalReleaseComObject(doc);

doc = null;

GC.WaitForPendingFinalizers();

GC.Collect();

GC.WaitForPendingFinalizers();

}

回答:

在.NET

4.0中,运行时将作为Windows结构化错误处理(SEH)错误引发的某些异常作为损坏状态的指示符进行处理。这些受破坏状态异常(CSE)不允许被您的标准托管代码捕获。我不会在这里介绍原因或方式。阅读有关.NET

4.0框架中CSE的文章:

http://msdn.microsoft.com/zh-

CN/magazine/dd419661.aspx#id0070035

但是有希望。有几种方法可以解决此问题:

  1. 重新编译为.NET 3.5程序集,然后在.NET 4.0中运行它。

  2. 在配置/运行时元素下,将一行添加到应用程序的配置文件中: <legacyCorruptedStateExceptionsPolicy enabled="true|false"/>

  3. 使用HandleProcessCorruptedStateExceptions属性装饰要捕获这些异常的方法。有关详细信息,请参见http://msdn.microsoft.com/zh-cn/magazine/dd419661.aspx#id0070035。


以前,我引用了一个论坛帖子以获取更多详细信息。但是,由于Microsoft

Connect已停用,因此,如果您有兴趣,以下是其他详细信息:

来自Microsoft CLR团队的开发人员Gaurav Khanna

此行为是设计导致的,这归因于CLR

4.0的一项功能,称为“损坏的状态异常”。简而言之,托管代码不应尝试捕获表示已损坏进程状态的异常,而AV就是其中之一。

然后,他继续参考HandleProcessCorruptedStateExceptionsAttribute和上面的文章上的文档。可以说,如果您正在考虑捕获这些类型的异常,那么绝对值得一读。

以上是 如何处理AccessViolationException 的全部内容, 来源链接: utcz.com/qa/419467.html

回到顶部