2013-03-21 144 views
0

我试图抓住一个互操作异常在我的C#代码如何捕获Interop异常?

IEngine engine = null; 

try 
{ 
    engine = engineLoader.GetEngineObject(AbbyySdkSerialNumber); 
} 
catch(System.Runtime.InteropServices.COMException ex) 
{ 
    int i = 0; 
} 

,但它并不想跳进catch块。有任何想法吗?先谢谢你!

+0

愚蠢的问题,但你** **错误? – LiverpoolsNumber9 2013-03-21 15:46:13

+0

异常类型是否完全匹配? – asawyer 2013-03-21 15:46:17

+1

试试你赶高级期待(Exception对象) – Jacek 2013-03-21 15:46:28

回答

3

的CLR自动映射从COM的HRESULT互操作,以更具体的托管异常,收到COMException。例如,E_ACCESSDENIED变为UnauthorizedAccessException,E_OUTOFMEMORY变为OutOfMemoryException等等。

如果HRESULT是一个自定义结果,或者它对于CLR是未知的,那么运行时确实会将一个通用的COMException传递给客户端。 COMException的ErrorCode属性包含HRESULT值。

有关COM互操作的完整讨论,请参阅Advanced COM Interoperability

请注意,如果您正在VS调试器下运行此操作,那么默认情况下执行将停止在导致异常的行上。它不会跳到catch块,除非您继续下一行。

+0

上面的链接已过时 - 我在这里找到Advanced Com Interop:https://msdn.microsoft.com/en- us/library/bd9cdfyx(v = vs.100).aspx – holtavolt 2017-10-05 13:32:49

+0

@holtavolt:非常感谢 - 我修复了陈旧的链接。 – RoadWarrior 2017-10-05 22:29:47

1

如果肯定抛出异常,那么我敢打赌它并没有抛出你期望的异常类型,即System.Runtime.InteropServices.COMException。我建议为try增加一个catch (Exception ex)子句,以便首先检查我的理智,然后再检查被抛出的异常。

0

我有同样的例外。它说我的项目ID是错误的 - 这应该是您在初始化期间将要插入的对象序列号。

建议: 请先检查一下,如果您在试用期运行,那么如果没有过期。

我通过win服务运行SDK时出现异常。服务以本地服务启动,并且由于无法通过GetEngineObject创建引擎对象而无法工作。 我也尝试通过不同的用户名(进程)创建对象GetEngineObject,但它没有帮助。这就是为什么我认为我在Visual Studio中创建控制台应用程序的用户名区别,在那里我将代码放在它上面,并在VS中以调试模式运行! (VS在我的用户名运行)

我不知道什么是错的...

0

对于我来说,我需要赶产生异常的具体类型。 它正在代码的托管部分中生成System.IO.IOException类型的异常,并且在我需要执行catch(IOException ^)的非托管代码中,什么解决了问题。 或者,即使使用catch(例外^),该例外从未被捕获。