2011-11-04 27 views
2

混合模式C++項目。本地代碼正在調用託管代碼。託管代碼可能會引發異常。我可以使用向量異常處理程序以純模式捕獲異常;我可以看到它的PEXCEPTION_POINTERS。告訴代碼0xE0434F4D,這意味着它是一個CLR異常,在那裏。在混合模式C++項目中從CLR-SEH異常中獲取合理的信息

問題:有沒有什麼辦法從助理數據中獲取任何合理的信息(異常類,消息,堆棧跟蹤等)? ExceptionInformation中有一個參數,它看起來像一個指向某個東西的指針...

+0

不,那是爲時已晚。你得到的只是例外代碼。如果原始託管異常是由處理器故障引起的,則可能會在ExceptionInformation中獲得一些內容。像NullReference或AccessViolation一樣。這不會有幫助,因爲您不再瞭解原始SEH異常。使用COM爲您提供更好的鼠標陷阱,CLR實現IErrorInfo。但您嘗試運行的託管代碼可能不是[ComVisible]。通過捕獲Exception的託管存根調用代碼可能是一個更好的角度。 –

+0

@HansPassant,沒有冒犯 - 但這不是一個評論,這是一個答案。做到這一點! –

+2

每個人都喜歡快樂的答案。這不是一個快樂的答案。 –

回答

0

不,這太晚了。你得到的只是例外代碼。如果原始託管異常是由處理器故障引起的,則可能會在ExceptionInformation中獲得一些內容。像NullReference或AccessViolation一樣。這不會有幫助,因爲您不再瞭解原始SEH異常。使用COM爲您提供更好的鼠標陷阱,CLR實現IErrorInfo。但您嘗試運行的託管代碼可能不是[ComVisible]。通過捕獲Exception的託管存根調用代碼可能是一個更好的角度。

+0

我將此帖發佈爲以下博文的精神回答 http://www.joelonsoftware.com/items/2008/09/15.html –

1

有類似的答案在這裏這個問題:
Catching a CLR exception through unmanaged code

這適用於以下方式解決:

#import <mscorlib.tlb> raw_interfaces_only no_smart_pointers named_guids no_implementation 

ATL::CComPtr<IErrorInfo> spErrorInfo; 
ATL::CComPtr<mscorlib::_Exception> spCLRException; 
ATL::CComPtr<mscorlib::_Exception> spCLRInnerException; 

ATL::CComBSTR bstrCLRStackTrace; 
ATL::CComBSTR bstrCLRMessage; 

GetErrorInfo(0, &spErrorInfo) 
spErrorInfo.QueryInterface(&spCLRException) 
spCLRException->get_InnerException(&spCLRInnerException) 
spCLRInnerException->get_StackTrace(&bstrCLRStackTrace) 
spCLRInnerException->get_Message(&bstrCLRMessage) 
相關問題