我正在尝试向Effort 库中的代码块添加一些错误处理,该代码块生成表达式树以执行转换并将结果分配给属性。
现有代码的问题是,当尝试将 null 分配给具有值类型的属性时,在运行时调用此表达式时会引发 NullReferenceException。在这种情况下,我没有关于它试图分配的属性的信息,所以我想抛出一个更具体的异常。
以下是我第一次尝试将此逻辑封装在 try/catch 块中,如果转换失败则抛出异常。最终我会向 InvalidOperationException 添加更多信息。
blockElements.Add(
Expression.TryCatch(
Expression.Assign(
Expression.Property(result, this.Properties[i]),
Expression.Convert(
Expression.ArrayIndex(parameter, Expression.Constant(i)),
this.Properties[i].PropertyType)),
Expression.Catch(typeof(NullReferenceException),
Expression.Throw(Expression.Constant(
new InvalidOperationException("Unhandled exception"))))));
在我看来,这就是我想要做的:
try
{
Property = (int)value;
}
catch (NullReferenceException)
{
throw new InvalidOperationException("Unhandled exception");
}
但是在运行时,该表达式现在会引发 ArgumentException,并显示消息“catch 的主体必须与 try 的主体具有相同的类型”。我在这里做错了什么?我是否需要在 Catch 表达式中创建一个 Block 来“返回”一些虚拟值,即使它永远不会因为 Throw 而被击中?
还是我以完全错误的方式处理这个问题?