2013-07-13 19 views
1

我有一個關於異常並將控制權返回給COM調用者的問題。下面是一個自定義異常類的測試問題。是什麼拋出新的CustomException與Marshal.ThrowExceptionForHR

Marshal.ThrowExceptionForHR(CustomException.COR_E_ARGUMENT); 

throw new CustomException("Argument is out of bounds"); 

之間的區別我有點明白爲什麼1)和2,因爲它們返回一個int和一個例外對象不起作用。但是3和4有什麼區別?

public class CustomException : ApplicationException 
{ 
    public static int COR_E_ARGUMENT = unchecked((int)0x80070057); 
    public CustomException(string msg) 
     : base(msg) 
    { 
     HResult = COR_E_ARGUMENT; 
    } 
} 

你需要編寫將使用CustomException類 立即控制返回給調用者COM代碼段。您還需要確保 調用方有權訪問錯誤代碼。您使用哪個代碼段 ?

  1. return Marshal.GetExceptionForHR(CustomException.COR_E_ARGUMENT);
  2. return CustomException.COR_E_ARGUMENT;
  3. Marshal.ThrowExceptionForHR(CustomException.COR_E_ARGUMENT);
  4. 拋出新的CustomException(「Argument is out of bounds」); //正確答案

回答

3

COM客戶端代碼當然完全不受.NET異常類型的影響,它只能看到HRESULT錯誤代碼。所以沒有添加你自己的異常類型的增值。

所有標準的.NET異常派生類都已經預先燒入了一個HRESULT值。他們在其構造函數中分配Exception.HResult屬性。如果要生成E_INVALIDARG(0x80070057),則使用已使用該錯誤代碼的標準.NET異常類。 System.ArgumentException。