1

在一些VC++代碼塊我收到以下第一次機會異常 -抓住第一次機會異常VC++

在0x77e4bef7在MYAPP.EXE第一次機會異常:微軟C++異常:ComUtil :: ComError在內存位置0x0013ee04 ..

我可以在Visual Studio的Output窗口中看到上述異常。 我怎樣才能捕捉到這個例外。我正在使用Visual Studio 2008進行開發。

+0

你確定要抓住它嗎? http://blogs.msdn.com/b/davidklinems/archive/2005/07/12/438061.aspx – CompuChip

+0

實際上,在應用程序中有很多例外的COM內存錯誤出現在調試過程中,稍後由於這個應用程序崩潰和Visual Studio鎖。因此,我想抓住這些例外。 – nvivekgoyal

+0

問題是,它們已經被捕獲 - 這是第一次機會異常的含義。您可以嘗試附加探查器或類似VLD(視覺泄漏探測器)的東西來找出泄漏的來源。 – CompuChip

回答

5

它只是一個調試器通知,並沒有其他任何含義。你像通常那樣捕捉異常,只需嘗試/捕捉。在這種情況下你想要catch (_com_error& ex),它告訴你爲什麼你的COM方法調用失敗。

「一次機會」異常很有用,因爲您可以要求調試器在拋出異常時停止。它可以讓你找出爲什麼它被拋出。您使用Debug + Exceptions,爲C++異常勾選Thrown複選框。在_com_error異常情況下不會非常有趣,您只會看到從#import指令中獲得的自動生成的包裝。如果您不想看到通知的噪音,只需右鍵單擊「輸出」窗口並取消「異常消息」。

+0

感謝您回答我的問題。我想問的是,我能解決這個第一次機會異常嗎?我需要更新VC++代碼來解決它嗎? – nvivekgoyal

+1

您需要*修復*您的代碼。您正在進行COM方法調用,並返回失敗HRESULT。它映射到_com_error異常,所以你不能忽略失敗。使用_com_error類的成員來診斷原因。 Error()方法返回HRESULT,而Description()方法返回描述錯誤的字符串。在使用COM時,絕不要吝嗇錯誤處理。方法可以和*做*失敗。由於服務器安裝不正確,通常很早就開始編寫代碼。 –

+0

謝謝!在代碼的進一步研究中,我發現代碼無法打開註冊表項。因此,使用以下代碼從代碼中引發異常 - 拋出ComUtil :: ComError(description,hr); 執行此行時會引發第一次機會異常。稍後在catch塊中選擇Com錯誤並記錄正確的消息。我希望像通常一樣在catch塊中選擇Com錯誤時抑制第一次機會異常。我怎樣才能做到這一點?我需要刪除拋出關鍵字嗎? – nvivekgoyal

相關問題