如何处理AccessViolationException?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (27)

我正在使用我的.net应用程序中的COM对象(MODI)。我正在调用的方法抛出一个System.AccessViolationException,它被Visual Studio拦截。奇怪的是,我已经把我的调用包装在try catch中,它具有处理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 Framework中CSE的文章:

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

  1. 重新编译为.NET 3.5程序集并在.NET 4.0中运行它。
  2. 在配置/运行时元素下添加一行到应用程序的配置文件中: <legacyCorruptedStateExceptionsPolicy enabled="true|false"/>
  3. HandleProcessCorruptedStateExceptions属性装饰你想要捕捉这些异常的方法。有关详细信息,请参阅http://msdn.microsoft.com/zh-cn/magazine/dd419661.aspx#id0070035
用户回答回答于

在配置文件中添加以下内容,它将在try catch块中捕获。谨慎的话......尽量避免这种情况,因为这意味着某种违规行为正在发生。

<configuration>
   <runtime>
      <legacyCorruptedStateExceptionsPolicy enabled="true" />
   </runtime>
</configuration>

扫码关注云+社区