我正在研究使用post sharp,我正在尝试整理一些演示。其中一个是记录异常的方面,另一个是检查空参数并在遇到异常时抛出异常。
我遇到的问题是我希望我的异常日志记录方面记录null检查方面抛出的异常。它似乎没有工作。有没有人知道如何使这项工作?
编辑:要清楚,异常记录器正在处理在方面之外抛出的异常,但是没有记录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);
}
}
我还应该提一下,我只是使用免费许可证。
答案 0 :(得分:7)
PostSharp不允许您在方面类上应用方面,这是您在[ExceptionLogger]
类中应用NullCheckAttribute
时尝试执行的操作。
目前,如果在方面类上检测到方面属性,则会以静默方式忽略它。它的行为方式是这样的,因为大多数时候这个应用程序是无意的(通过多播)。
实现所需效果的正确方法(记录空检查引发的异常)是将两个属性应用于目标方法。另外,请记住,应用属性的顺序很重要。如果您为此示例更改它,那么您将看不到您的日志消息 - 因为将在异常记录器引入的try / catch之前执行空检查。
[ExceptionLogger(AspectPriority = 1)]
[NullCheck(AspectPriority = 2)]
private void TestMethod(string s)
{
Console.WriteLine(s);
}