运行时生成表达式中的访问异常

本文关键字:访问 异常 表达式 运行时 | 更新日期: 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()());

打印出:

试图除以零。