1

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

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. 返回 Marshal.GetExceptionForHR(CustomException.COR_E_ARGUMENT);
  2. 返回 CustomException.COR_E_ARGUMENT;
  3. Marshal.ThrowExceptionForHR(CustomException.COR_E_ARGUMENT);
  4. throw new CustomException("参数越界"); // 正确答案
4

1 回答 1

3

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

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

于 2013-07-13T13:22:14.820 回答