C# 如何对某个HResult抛出异常?

C# 如何对某个HResult抛出异常?,c#,exception,testing,marshalling,hresult,C#,Exception,Testing,Marshalling,Hresult,我想测试以下代码: private bool TestException(Exception ex) { if ((Marshal.GetHRForException(ex) & 0xFFFF) == 0x4005) { return true; } return false; } 我想以某种方式设置Exception对象以返回正确的HResult,但我在Exception类中看不到允许此操作的字段 我该怎么做呢?我找到了三种方法: 使用

我想测试以下代码:

private bool TestException(Exception ex)
{
    if ((Marshal.GetHRForException(ex) & 0xFFFF) == 0x4005)
    {
        return true;
    }
    return false;
}
我想以某种方式设置
Exception
对象以返回正确的HResult,但我在
Exception
类中看不到允许此操作的字段


我该怎么做呢?

我找到了三种方法:

  • 使用类,将错误代码作为参数传入:

    var ex = new ExternalException("-", 0x4005);
    
    感谢他对这一点的解释

  • 使用继承传递模拟异常以访问受保护字段:

    private class MockException : Exception
    {
        public MockException() { HResult = 0x4005; }
    }
    
    var ex = new MockException();
    
  • 使用.NET反射设置基础字段:

    BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic;
    FieldInfo hresultFieldInfo = typeof(Exception).GetField("_HResult", flags);
    
    var ex = new Exception();
    hresultFieldInfo.SetValue(ex, 0x4005);
    

  • 将这些异常中的任何一个传递给问题中的方法,将导致该方法返回
    true
    。我认为第一种方法最有用。

    我发现创建一个扩展来实现这一点很有用

    using System.Reflection;
    
    namespace Helper
    {
        public static class ExceptionHelper 
        {
           public static Exception SetCode(this Exception e, int value)
           {
               BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic;
               FieldInfo fieldInfo = typeof(Exception).GetField("_HResult", flags);
    
               fieldInfo.SetValue(e, value);
    
               return e;
            }
    }
    
    然后抛出异常:

    using Helper;
    
    public void ExceptionTest()
    {
        try
        {
            throw new Exception("my message").SetCode(999);
        }
        catch (Exception e)
        {
            string message = e.Message;
            int code = e.HResult;
        }
    }
    

    此类异常的基本异常类是ExternalException。它有一个带有构造函数的公共ErrorCode属性来设置它。COMException类的默认HRESULT已经是0x80004005(E_FAIL)。