在方法上貼上attribute(特性)捕捉方法的異常,其實這麼做也是為了在專案中不會大量使用try…cacth這樣的語句,同時使我們的程式碼看起來更簡潔,更直觀,將邏輯業務分離使得後期維護方便。這裡我們需要AOP方面的知識。(自行百度解決這知識)

AOP(基於切面程式設計):它是對業務邏輯的分離,使各個業務直接的耦合變低,比如在傳統的OOP程式設計中將日誌記錄、異常處理、許可權管理等方面剝離出來。在今後的維護過程中,對其改變日誌記錄、異常處理、許可權管理方法的時候,不用去改變主業務流程邏輯程式碼。提高開發效率。

PostSharp採用特性的方式來對編譯後的主業務流程方法邏輯橫向靜態注入擷取資料。下面我們將以一個例項來演示如何使用PostSharp實現AOP進行日誌記錄和異常處理。

首先需要安裝PostSharp 2.1.4.1免費版本,這個版本只是功能相對較少,可商用,但能夠滿足日誌記錄和異常擷取的要求。點選下載

    //擷取方法異常並且處理異常
[Serializable]
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
class ExceptionAttribute:MethodInterceptionAspect
{
//呼叫本函式時擷取異常
public override void OnInvoke(MethodInterceptionArgs args)
{
try
{
base.OnInvoke(args);
}
catch(Exception ex)
{
Console.WriteLine(string.Format("此方法異常資訊是:{0}", ex.ToString()));
}
}
}
 
    //日誌特性擷取類
[Serializable]
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
class LogsAttribute:OnMethodBoundaryAspect
{
/// <summary>
/// 入口引數資訊
/// </summary>
public string EntryText { get; set; } /// <summary>
/// 出口引數資訊
/// </summary>
public string ExitText { get; set; } /// <summary>
/// 異常資訊
/// </summary>
public string ExceptionText { get; set; } //進入方法時輸出方法的輸入引數
public override void OnEntry(MethodExecutionArgs eventArgs)
{
Arguments arguments = eventArgs.Arguments;
StringBuilder sb = new StringBuilder();
ParameterInfo[] parameters = eventArgs.Method.GetParameters();
for (int i = 0; arguments != null && i < arguments.Count; i++)
{
//進入的引數的值
sb.Append( parameters[i].Name + "=" + arguments[i] + " ");
}
string message = string.Format("{0}.{1} Method. The Entry Arg Is:{2}",
eventArgs.Method.DeclaringType.FullName, eventArgs.Method.Name, sb.ToString());
Console.WriteLine(message);
} //退出方法時的方法返回值
public override void OnExit(MethodExecutionArgs eventArgs)
{
Console.WriteLine(string.Format("{0}.{1} Method. The Result Is:{2}",
eventArgs.Method.DeclaringType.FullName, eventArgs.Method.Name, eventArgs.ReturnValue.ToString()));
} //方法發生異常時記錄異常資訊--這裡可截獲我要的方法異常資訊
public override void OnException(MethodExecutionArgs eventArgs)
{
Console.WriteLine(string.Format("{0}.{1} Method. The Exception Is:{2}",
eventArgs.Method.DeclaringType.FullName, eventArgs.Method.Name, eventArgs.Exception.Message)); }
}
 
專案中我們的使用方式,通常只需要捕捉方法的異常資訊就行
 static void Main(string[] args)
{
Add(3, 5);
Console.WriteLine("-------------------------------------------------------");
Subject(5, 12);
Subject22(4, 0);
Console.ReadLine();
} //此函式讓我們看其輸入引數和返回值的日誌記錄
[Logs]
[Exception]
public static int Add(int a, int b)
{
return a + b;
} //此函式看我們的異常通過自定義Exception特性記錄下來
[Logs]
[Exception]
public static int Subject(int a, int b)
{ throw new ArgumentException("減法出現異常,需要處理"); return a - b;
}
//此函式獲取方法的異常資訊---通常我們用這個就可以了。
[Exception]
public static int Subject22(int a, int b)
{ throw new ArgumentException("嘗試除以0"); return a/b;
}
 
        專案中我們使用種方式就足夠了,只需要貼在方法上的特效能捕捉到異常並做處理就OK了。
//此函式獲取方法的異常資訊---通常我們用這個就可以了。
[Exception]
public static int Subject22(int a, int b)
{ throw new ArgumentException("嘗試除以0"); return a/b;
}
 
本文來自:http://www.cnblogs.com/chengxingliang/archive/2011/11/21/2248436.html
感謝這位兄弟付出。測試原始碼下載