抛出新的CustomException与Marshal.ThrowExceptionForHR

时间:2013-07-13 13:10:38

标签: c# exception com

我有一个关于异常并将控制权返回给COM调用者的问题。下面是一个带有自定义异常类的测试问题。有什么区别

Marshal.ThrowExceptionForHR(CustomException.COR_E_ARGUMENT);

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

我有点理解为什么1)和2不起作用,因为它们返回一个int和一个Exception-object。但是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. 返回Marshal.GetExceptionForHR(CustomException.COR_E_ARGUMENT);
  2. 返回CustomException.COR_E_ARGUMENT;
  3. Marshal.ThrowExceptionForHR(CustomException.COR_E_ARGUMENT);
  4. 抛出新的CustomException(“Argument超出范围”); //正确答案

1 个答案:

答案 0 :(得分:3)

COM客户端代码当然完全不了解.NET Exception类型,它只能看到HRESULT错误代码。因此,添加自己的异常类型没有任何附加值。

所有标准的.NET Exception派生类都已经预先填充了预先映射的HRESULT值。他们在构造函数中分配Exception.HResult属性。如果要生成E_INVALIDARG(0x80070057),请使用已使用该错误代码的标准.NET异常类。 System.ArgumentException。