运行时生成表达式中的访问异常
本文关键字:访问 异常 表达式 运行时 | 更新日期: 2023-09-27 18:07:24
很明显。我对表达式做了一些运行时魔术。我的单元测试抛出了一个异常,因为我正在做的事情非常复杂,因此很明显会失败。
我不知道如何调试生成的委托,所以作为解决方案,我想插入一个try-catch,它将异常记录到控制台。
我只是不明白如何访问异常变量。变量由CatchBlock
-类公开。但是我必须通过工厂方法中的主体,因为它不在作用域内。
如何访问?我没有看到任何合法的,非黑客的方法来做到这一点,因为这是一个非常不寻常的话题,几乎没有文档/信息可以在互联网上找到。
下面是目前为止的代码:// The actual code
BlockExpression block = Expression.Block(new[] {messageParam, objectParam},
callExpressions.ToArray());
// The catch block around it
CatchBlock catchExpression = Expression.Catch(typeof(Exception),
Expression.Call(typeof(Console).GetMethod(nameof(Console.WriteLine),
BindingFlags.Public | BindingFlags.Static, null, CallingConventions.Any, new[] {typeof(string)},
null),
Expression.Call(// Here should be the ParameterExpression
typeof(Exception).GetProperty(nameof(Exception.Message),
BindingFlags.Public | BindingFlags.Instance).GetMethod)));
// The try-block for the catch
TryExpression tryExpression = Expression.TryCatch(block, catchExpression);
// Compilation ...
我拼命地想解决同样的问题。我有非常相似的原因——跟踪动态表达式的目的。最终的解决方案很简单,只需使用不同的重载Expression.Catch.
虽然-由于非常稀疏的文档和示例很难找到。
因此,如果其他人需要类似的功能-这里有一个非常基本的工作示例(您可以用自定义表达式日志记录到您的记录器等):
var parExcep = Expression.Parameter(typeof (Exception), "exc");
MethodInfo excMsg = typeof(Exception).GetProperty("Message",
BindingFlags.Public | BindingFlags.Instance).GetMethod;
TryExpression tryCatchExpr =
Expression.TryCatch(
Expression.Block(
Expression.Throw(Expression.Constant(new DivideByZeroException())),
Expression.Constant("Try block")
),
Expression.Catch(
parExcep,
Expression.Call(parExcep, excMsg)
)
);
Console.WriteLine(Expression.Lambda<Func<string>>(tryCatchExpr).Compile()());
打印出:
试图除以零。