我正在从.net应用程序中使用COM对象(MODI)。我正在调用的方法将引发System.AccessViolationException,它会被Visual Studio拦截。奇怪的是,我将调用包装在一个try捕获中,该捕获具有用于AccessViolationException,COMException和其他所有内容的处理程序,但是当Visual Studio(2010)拦截AccessViolationException时,调试器会中断方法调用(doc.OCR),如果我单步执行,它将继续到下一行而不是进入catch块。此外,如果我在Visual Studio之外运行此程序,则应用程序将崩溃。我该如何处理COM对象中引发的异常? 通用标签

有帮助吗?

解决方案

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

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

但是有希望。有几种解决方法:

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

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

  3. 使用HandleProcessCorruptedStateExceptions属性装饰要捕获这些异常的方法。请参阅 http://msdn.microsoft.com/en-us/magazine/ dd419661.aspx#id0070035 了解详情。


    编辑

    以前,我引用了论坛帖子以获取更多详细信息。但是,由于Microsoft Connect已停用,因此,如果您有兴趣,这里是其他详细信息:

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

    此行为是设计导致的,原因是CLR 4.0的一项功能称为“损坏的状态异常”。简而言之,托管代码不应尝试捕获表明进程状态已损坏的异常,而AV就是其中之一。

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

其他提示

在配置文件中添加以下内容,它将在try catch块中被捕获。 请注意...要避免这种情况,因为这意味着某种违规行为正在发生。 通用标签

根据以上答案进行编译,为我工作,并按照以下步骤进行操作。

步骤1-将以下代码段添加到配置文件中 通用标签

步骤2

添加- 通用标签

您要绑定的函数顶部捕获异常

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

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

**编辑*

这里有一些更多信息(可能是有用的长时间阅读)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top