将方面应用于具有后期锐利的方面

本文关键字:方面 应用于 | 更新日期: 2023-09-27 18:33:30

我正在考虑使用post sharp,我正在尝试整理一些演示。其中一个是将记录异常的方面,另一个是检查空参数并在遇到异常时抛出异常。

我遇到的问题是我希望我的异常日志记录方面记录空检查方面抛出的异常。它似乎不起作用。有谁知道一种方法可以做到这一点?

编辑:为了清楚起见,异常记录器正在处理在方面之外抛出的异常,但没有记录在 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);
    }
}

我还应该提到,我只是为此使用免费许可证。

将方面应用于具有后期锐利的方面

PostSharp 不允许你在方面类上应用方面,这是你试图通过在类中应用[ExceptionLogger]NullCheckAttribute做的事情。

目前,如果在坡向类上检测到方面属性,则会以静默方式忽略该属性。它之所以以这种方式运行,是因为大多数情况下此应用程序是无意的(通过多播)。

实现所需效果(记录 null 检查引发的异常)的正确方法是将这两个属性应用于目标方法。另外,请记住,应用属性的顺序很重要。如果您为此示例更改它,那么您将不会看到您的日志消息 - 因为空检查将在异常记录器引入的 try/catch 之前执行。

    [ExceptionLogger(AspectPriority = 1)]
    [NullCheck(AspectPriority = 2)]
    private void TestMethod(string s)
    {
        Console.WriteLine(s);
    }