2013-10-02 33 views
5

我正在研究使用後期銳利,我正試圖放在一起的幾個演示。其中一個是記錄異常的方面,另一個是檢查空參數,並在遇到一個異常時拋出異常。應用方面與postsharp方面

我遇到的問題是我想讓我的異常記錄方面記錄空檢查方面拋出的異常。它似乎沒有工作。有沒有人知道一種方法來完成這項工作?

編輯:要清楚,異常記錄器正在與拋出一個方面之外的例外,但是,這不是登錄thown在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); 
    } 
} 

的代碼,我還想說,我只使用免費許可 這個。

+1

'它似乎沒有工作。' - 究竟發生了什麼? – Muctadir

+0

異常記錄器正常工作正常,但NullCheckAttribute中引發的異常未被記錄。 –

+0

是否調試過'NullCheckAttribute'來查看'MethodExecutionArgs'確實爲null? – Muctadir

回答

7

PostSharp不允許您將方面應用於某個方面類,這是您嘗試通過在NullCheckAttribute類中應用[ExceptionLogger]來實現的方面。

當前,如果在某個方面類上檢測到方面屬性,則會默默忽略它。它的行爲方式是這樣的,因爲大多數情況下這個應用程序是無意的(通過多播)。

實現所需效果(記錄空檢查引發的異常)的正確方法是將兩個屬性應用於目標方法。另外請記住,應用屬性的順序很重要。如果您更改了此示例,則不會看到您的日誌消息 - 因爲空檢查將在異常記錄器引入的try/catch之前執行。

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

謝謝你的幫助:) –