最近写了一个抓取软件,用户反映软件偶尔会抛异常:
由于当时写代码时没有注意异常处理,大部分方法都没有写try…catch…finally的语句,所以很难找出异常是出在哪个地方,难道要为所有方法加上try…catch语句?头有点大,于是百度、Google,发现了PostSharp,它是基于.NET平台设计的比较强调易学易用的AOP框架,研究了一下,发现它确实很简单,并且有可能快速解决我这个问题。
打开PostSharp的主页,就可以看出它能干什么:
PostSharp有几个版本:免费版、专业版和旗舰版,有些功能需要出钱才行,幸运的是处理异常的功能是在免费版中包含的:
安装PostSharp很简单,它是Visual Studio的一个扩展,在扩展中可以找到,具体安装方法见:
快速入门地址:
http://www.postsharp.net/aspects/getting-started?utm_source=vsx&utm_medium=app&utm_campaign=Learn
以下是处理异常的简单Demo:
MyTraceAttribute.cs
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using PostSharp.Aspects;
namespace ConsoleApplication1
{
[Serializable]
public sealed class MyTraceAttribute : OnMethodBoundaryAspect
{
private readonly string category;
public MyTraceAttribute(string category)
{
this.category = category;
}
public override void OnEntry(MethodExecutionArgs args)
{
Trace.WriteLine(string.Format("Entering {0}.{1}.",
args.Method.DeclaringType.Name, args.Method.Name), this.category);
}
public override void OnExit(MethodExecutionArgs args)
{
Trace.WriteLine(string.Format("Leaving {0}.{1}.",
args.Method.DeclaringType.Name, args.Method.Name), this.category);
}
public override void OnException(MethodExecutionArgs args)
{
Trace.WriteLine(string.Format("Exception {0}.{1}.{2}.",
args.Method.DeclaringType.Name, args.Method.Name,args.Exception.Message), this.category);
args.FlowBehavior = FlowBehavior.Return;
}
public override void OnSuccess(MethodExecutionArgs args)
{
base.OnSuccess(args);
}
public string Category { get { return category; } }
}
}
Program.cs
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using PostSharp.Patterns.Diagnostics;
using PostSharp.Extensibility;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Trace.Listeners.Add(new TextWriterTraceListener(Console.Out));
Test();
Console.ReadKey();
}
[MyTrace("MyCategory")]
static void Test()
{
Console.WriteLine("Hello, world.");
throw new Exception();
}
}
}
运行结果如下: