【发布时间】:2017-05-11 06:59:41
【问题描述】:
我正在尝试向 block of code in the Effort library 添加一些错误处理,它会生成一个表达式树来执行转换并将该结果分配给一个属性。
现有代码的问题是,当尝试将 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 而被命中?
还是我以完全错误的方式处理这个问题?
【问题讨论】:
-
我当然会尝试将两者都包装在
Expression.Block中,因为这样可以更准确地反映您试图概括的代码。
标签: c# expression-trees