代码之家  ›  专栏  ›  技术社区  ›  Jeremy

如何处理AccessViolationException

  •  158
  • Jeremy  · 技术社区  · 15 年前

    我正在.NET应用程序中使用COM对象(modi)。我调用的方法引发System.AccessViolationException,它被Visual Studio拦截。奇怪的是,我已将调用包装在一个try catch中,该catch具有accessViolationException、comException等处理程序,但当Visual Studio(2010)截获accessViolationException时,调试器将中断方法调用(doc.ocr),如果我单步执行,它将继续执行下一行,而不是输入catch b。锁。此外,如果在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();
    
    }
    
    4 回复  |  直到 7 年前
        1
  •  267
  •   villecoder    7 年前

    在.NET 4.0中,运行时处理某些异常,这些异常作为Windows结构化错误处理(SEH)错误引发,作为损坏状态的指示器。标准托管代码不允许捕获这些损坏状态异常(CSE)。我不想知道为什么会这样,怎么会这样。阅读本文了解.NET 4.0框架中的CSE:

    http://msdn.microsoft.com/en-us/magazine/dd419661.aspx#id0070035

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

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

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

    3. 修饰要在其中捕获这些异常的方法 HandleProcessCorruptedStateExceptions 属性。见 http://msdn.microsoft.com/en-us/magazine/dd419661.aspx id0070035 详情。


    编辑

    以前,我引用了 forum post 更多细节。但由于Microsoft Connect已退役,以下是您感兴趣的其他详细信息:

    来自Gaurav Khanna,微软CLR团队的开发人员

    由于clr 4.0的一个被称为损坏状态异常的特性,这种行为是由设计造成的。简单地说,托管代码不应该试图捕获指示已损坏进程状态的异常,AV就是其中之一。

    然后他继续参考 HandleProcessCorruptedStateExceptionsAttribute 以及上述条款。可以这么说,如果您考虑捕获这些类型的异常,那么绝对值得一读。

        2
  •  13
  •   Partha    12 年前

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

    <configuration>
       <runtime>
          <legacyCorruptedStateExceptionsPolicy enabled="true" />
       </runtime>
    </configuration>
    
        3
  •  6
  •   EvilInside    9 年前

    从上面的答案汇编,为我工作,做了以下步骤来捕捉它。

    步骤1-将以下代码段添加到配置文件

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

    第2步

    添加-

    [HandleProcessCorruptedStateExceptions]
    
    [SecurityCritical]
    

    在函数的顶部,您正在绑定捕获异常

    来源: http://www.gisremotesensing.com/2017/03/catch-exception-attempted-to-read-or.html

        4
  •  1
  •   Tony Abrams    15 年前

    您可以尝试使用 AppDomain.UnhandledException 看看你能不能抓住它。

    **编辑*

    这里有一些 more information 这可能有用(这是一个长期的阅读)。

    推荐文章