2013-03-21 80 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(例外^),該例外從未被捕獲。