5

我正在研究使用 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);
    }
}

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

4

1 回答 1

7

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

目前,如果在一个方面类上检测到一个方面属性,那么它会被静默忽略。它以这种方式运行是因为大多数时候此应用程序是无意的(通过多播)。

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

    [ExceptionLogger(AspectPriority = 1)]
    [NullCheck(AspectPriority = 2)]
    private void TestMethod(string s)
    {
        Console.WriteLine(s);
    }
于 2013-10-02T11:59:20.587 回答