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();
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)。