抛出新的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调用方。您还需要确保调用方可以访问错误代码。哪个代码段应该你用?
- return Marshal.GetExceptionForHR(CustomException.COR_E_ARGUMENT)
- return CustomException.COR_E_ARGUMENT
- Marshal.SthrowExceptionForHR(CustomException.COR_E_ARGUMENT)
- throw new CustomException("参数越界");//正确答案
COM客户端代码当然完全不知道.NET异常类型,它只看到HRESULT错误代码。因此,添加您自己的异常类型不会增加任何价值。
所有标准的.NET Exception派生类都已在中烘焙了预编码的HRESULT值。它们在构造函数中分配Exception.HResult属性。如果要生成E_INVALIDARG(0x80070057),请使用已经使用该错误代码的标准.NET异常类。System.ArgumentException.