我在我的.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();
}
4 回答
在.NET 4.0中,运行时将作为Windows结构化错误处理(SEH)错误引发的某些异常处理为损坏状态的指示符 . 您的标准托管代码不允许捕获这些损坏的状态异常(CSE) . 我不会深入了解为什么或如何在这里 . 阅读本文关于.NET 4.0 Framework中的CSE:
http://msdn.microsoft.com/en-us/magazine/dd419661.aspx#id0070035
但是有希望 . 有几种方法可以解决这个问题:
重新编译为.NET 3.5程序集并在.NET 4.0中运行它 .
在配置/运行时元素下的应用程序配置文件中添加一行:
<legacyCorruptedStateExceptionsPolicy enabled="true|false"/>
使用
HandleProcessCorruptedStateExceptions
属性装饰要捕获这些异常的方法 . 有关详细信息,请参阅http://msdn.microsoft.com/en-us/magazine/dd419661.aspx#id0070035 .EDIT
之前,我引用了forum post以获取更多详细信息 . 但是,由于Microsoft Connect已经退役,以下是您感兴趣的其他详细信息:
来自Microsoft CLR团队的开发人员Gaurav Khanna
然后,他继续参考HandleProcessCorruptedStateExceptionsAttribute和上述文章中的文档 . 可以说,它正在考虑捕捉这些类型的例外情况 .
从上面的答案编译,为我工作,做了以下步骤来 grab 它 .
步骤#1 - 将以下代码段添加到配置文件
第2步
添加 -
在你正在追逐的功能的顶部 grab 异常
来源:http://www.gisremotesensing.com/2017/03/catch-exception-attempted-to-read-or.html
在配置文件中添加以下内容,它将在try catch块中捕获 . 小心谨慎......尽量避免这种情况,因为这意味着发生了某种违规行为 .
您可以尝试使用AppDomain.UnhandledException并查看是否可以捕获它 .
*编辑
这里有一些可能有用的more information(这是一个很长的阅读) .