使用PostSharp在方面之间应用方面。

5
我正在研究使用PostSharp,尝试编写一些演示。其中之一是一个方面,将记录异常,另一个是检查空参数并在遇到时抛出异常。
问题在于,我希望我的异常日志方面记录由空值检查方面引发的异常,但似乎无法正常工作。有人知道如何使其正常工作吗?
编辑:需要明确的是,异常记录器可以处理在方面外部引发的异常,但无法记录NullCheckAttribute引发的异常。
以下是空值检查方面的代码:
[Serializable]
public class NullCheckAttribute : OnMethodBoundaryAspect
{
    [ExceptionLogger]
    public override void OnEntry(MethodExecutionArgs args)
    {
        foreach (var argument in args.Arguments)
        {
            if (argument == null)
                throw new InvalidOperationException("Null argument in " + args.Method.Name);
        }
    }
}

以下是异常记录器的代码

[Serializable]
public class ExceptionLoggerAttribute : OnMethodBoundaryAspect
{
    public override void OnException(MethodExecutionArgs args)
    {
        Console.WriteLine("Exception thrown in " + args.Method.Name);
        Console.WriteLine("***Message: " + args.Exception.Message);
        Console.WriteLine("***Stack trace: " + args.Exception.StackTrace);
    }
}

我还应该说明的是,我只是使用了免费许可证。


1
似乎没有起作用。 - 到底发生了什么事? - Hossain Muctadir
异常记录器在处理普通异常时运行良好,但在 NullCheckAttribute 中抛出的异常未被记录。 - James Considine
你调试了NullCheckAttribute以查看MethodExecutionArgs是否确实为空吗? - Hossain Muctadir
是的。异常被抛出了,但没有记录任何内容。 - James Considine
1个回答

7
PostSharp不允许在一个切面类上应用切面,这就是你试图在NullCheckAttribute类中应用[ExceptionLogger]的原因所在。
目前,如果检测到一个切面属性应用在一个切面类上,则会被静默忽略。这样做是因为大多数情况下这种应用是无意的(通过多播实现)。
实现所需效果(记录空检查引发的异常)的正确方法是将两个属性都应用于目标方法。同时,请记住应用属性的顺序很重要。如果你在此示例中更改它,则看不到日志消息——因为空检查将在异常记录器引入的try/catch之前执行。
    [ExceptionLogger(AspectPriority = 1)]
    [NullCheck(AspectPriority = 2)]
    private void TestMethod(string s)
    {
        Console.WriteLine(s);
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接