抛出新的CustomException与Marshal.ThrowExceptionForHR

本文关键字:Marshal ThrowExceptionForHR CustomException | 更新日期: 2023-09-27 18:22:16

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

Marshal.ThrowExceptionForHR(CustomException.COR_E_ARGUMENT);

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

我有点明白为什么1)和2不起作用,因为它们返回了一个int和一个Exception对象。但是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.SthrowExceptionForHR(CustomException.COR_E_ARGUMENT)
  4. throw new CustomException("参数越界");//正确答案

抛出新的CustomException与Marshal.ThrowExceptionForHR

COM客户端代码当然完全不知道.NET异常类型,它只看到HRESULT错误代码。因此,添加您自己的异常类型不会增加任何价值。

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