c# - 我怎样才能抛出带有特定 HResult 的异常?

标签 c# exception testing marshalling hresult

我想测试下面的代码:

private bool TestException(Exception ex)
{
    if ((Marshal.GetHRForException(ex) & 0xFFFF) == 0x4005)
    {
        return true;
    }
    return false;
}

我想以某种方式设置 Exception 对象以返回正确的 HResult,但我在 Exception 类中看不到允许这样做的字段。

我该怎么做?

最佳答案

我找到了三种方法:

  1. 使用 System.Runtime.InteropServices.ExternalException类,将错误代码作为参数传入:

    var ex = new ExternalException("-", 0x4005);
    

    感谢@HansPassant感谢他解释这一点的评论。

  2. 使用继承传递模拟异常以访问 protected 字段:

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

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

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

关于c# - 我怎样才能抛出带有特定 HResult 的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11158379/

相关文章:

unit-testing - BDD主要用于集成测试吗?

PHPunit:测试问题

c# - 无法在 VS Code 终端中创建 C# 控制台应用程序

c# - 如何更改在asp中选择的文件的文本颜色:fileUpload in Safari?

c# - 过滤器需要通过引用传递才能附加到它

java - 自定义异常类不捕获异常

python - 出于测试目的模拟 SSH 服务器

c# - 关于 OOPS 和 C# 中的编码风格

python - 为什么 Python 不能捕获 C++ 中引发的异常?

ios - NSMutableArray removeAllObjects 越界异常