如何处理AccessViolationException

我在.net应用程序中使用COM对象(MODI)。 我调用的方法抛出一个System.AccessViolationException,它被Visual Studio拦截。 奇怪的是,我已经把我的调用包装在一个try catch中,它有处理AccessViolationException,COMException和其他所有东西,但是当Visual Studio(2010)拦截AccessViolationException时,debugging器中断了方法调用(doc.OCR)如果我经过,它会继续到下一行,而不是进入catch块。 此外,如果我运行在Visual Studio以外,我的应用程序崩溃。 我怎样才能处理这个C​​OM对象中引发的exception?

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结构化error handling(SEH)错误引发的exception,作为损坏状态的指示器。 这些损坏的状态exception(CSE)不允许被您的标准托pipe代码捕获。 我不会介入为什么或在这里如何。 阅读这篇关于.NET 4.0框架中的CSE的文章:

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

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

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

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

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

有关更多参考: http : //connect.microsoft.com/VisualStudio/feedback/details/557105/unable-to-catch-accessviolationexception

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

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

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

步骤#1 – 将以下代码片段添加到configuration文件中

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

第2步

添加 –

 [HandleProcessCorruptedStateExceptions] [SecurityCritical] 

在你正在绑定的函数的顶部捕捉exception

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

你可以尝试使用AppDomain.UnhandledException ,看看是否让你抓住它。

**编辑*

这里有一些可能有用的信息(这是一个很长的阅读)。