.NET Interop: 從IErrorInfo錯誤物件獲得託管程式碼的異常資訊

ATField發表於2007-04-18

當呼叫IDispatch::Invoke函式的時候,當函式呼叫過程中丟擲了異常,Invoke函式會返回DISP_E_EXCEPTION,代表異常發生。Invoke函式的pExceptionInfo引數可以提供關於異常的有關資訊:

IDispatch *pDisp;

EXCEPINFO excepInfo;

HRESULT hr = pDisp->Invoke(…, &excepInfo);

 

if( hr == DISP_E_EXCEPTION )

{

      // 使用excepInfo獲得異常資訊

}

 

pDisp指向一個託管物件(Managed Object)的時候,excepInfo並不能提供足夠的資訊。這個時候我們可以使用IErrorInfo_Exception介面來獲得託管的異常資訊。_Exceptionmscorlib.dll提供的對託管異常的支援的介面(mscorlib.dll同時還有大量的介面可以供Interop的時候使用),可以通過#import來匯入mscorlib.dll中的COM介面:

// 匯入.NET Framework 2.0版本中的mscorlib.dllType Library

#import "C:/Windows/Microsoft.NET/Framework/v2.0.50727/mscorlib.tlb" no_namespace named_guids raw_interfaces_only

 

之後,當Invoke返回DISP_E_EXCEPTION的時候,呼叫::GetErrorInfo函式獲得IErrorInfo物件:

IDispatch *pDisp;

EXCEPINFO excepInfo;

HRESULT hr = pDisp->Invoke(…, &excepInfo);

 

if( hr == DISP_E_EXCEPTION )

{

      IErrorInfoPtr pErrorInfo;

      :GetErrorInfo(0, &pErrorInfo);

IErrorInfo所指向的錯誤物件當丟擲託管異常的時候,將會支援_Exception介面,這個介面可以通過一個QueryInterface獲得。通過智慧指標,只需簡單做一個賦值即可。

      // 獲得錯誤物件的_Exception介面
      _ExceptionPtr pException = pErrorInfo;

之後,便可以使用_Exception介面所支援的各種方法來獲得託管異常的有關資訊了,比如:

      // _Exception轉換成字串,用於顯示

      _bstr_t bstrString;
      pException->get_ToString(bstrString.GetAddress()
);

}

 

 

作者:      ATField
Blog:     
http://blog.csdn.net/atfield
轉載請註明出處

 

相關文章