2013-10-02 6 views
5

के साथ पहलुओं के पहलुओं को लागू करना मैं पोस्ट तेज का उपयोग करने में देख रहा हूं और मैं कुछ डेमो को एक साथ रखने की कोशिश कर रहा हूं। उनमें से एक ऐसा पहलू था जो अपवादों को लॉग करेगा, और दूसरा शून्य तर्कों की जांच करना था और किसी का सामना होने पर अपवाद फेंकना था।पोस्टशर्प

मेरी समस्या यह है कि मैं अपने अपवाद लॉगिंग पहलू को शून्य जांच पहलू द्वारा फेंकने वाले अपवादों को लॉग इन करना चाहता हूं। ऐसा लगता है कि यह काम नहीं कर रहा है। क्या कोई इस काम को करने का तरीका जानता है?

संपादित करें: स्पष्ट है कि, अपवाद लकड़हारा अपवाद है कि एक पहलू के बाहर फेंक दिया जाता है के साथ काम कर रहा है, लेकिन अपवाद NullCheckAttribute

पर thown अशक्त पहलू की जाँच के लिए कोड के रूप में

इस प्रकार प्रवेश करने नहीं है
[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

क्या आपने 'MethodExecutionArgs' वास्तव में शून्य को देखने के लिए 'NullCheckAttribute' को डीबग किया था? – Muctadir

उत्तर

7

पोस्टशर्प आपको पहलू वर्ग पर पहलुओं को लागू करने की अनुमति नहीं देता है, जो [ExceptionLogger]NullCheckAttribute कक्षा में लागू करके आप क्या करने की कोशिश कर रहे हैं।

वर्तमान में, यदि किसी पहलू वर्ग पर एक पहलू विशेषता का पता लगाया गया है, तो इसे चुपचाप अनदेखा किया जाता है। यह इस तरह से व्यवहार करता है क्योंकि अधिकांश समय यह एप्लिकेशन अनजान है (मल्टीकास्टिंग के माध्यम से)।

वांछित प्रभाव प्राप्त करने का सही तरीका (शून्य जांच द्वारा छोड़ा गया अपवाद लॉग करें) लक्ष्य विधि दोनों गुणों को लागू करना है। साथ ही, ध्यान रखें कि लागू विशेषताओं का क्रम महत्वपूर्ण है। यदि आप इसे इस उदाहरण के लिए बदलते हैं, तो आपको अपना लॉग संदेश नहीं दिखाई देगा - क्योंकि अपवाद लॉगर द्वारा शुरू किए गए प्रयास/पकड़ से पहले शून्य जांच निष्पादित की जाएगी।

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

मदद के लिए धन्यवाद :) –

संबंधित मुद्दे