2012-08-01 15 views
5

में कॉल साइट पर अवरुद्ध तरीकों के लिए पूर्ण स्टैक ट्रेस हम अवरोध के साथ लॉगिंग सेवा विधियों को संभालने के लिए एकता का उपयोग कर रहे हैं। हालांकि, एक चिंता यह है कि पूर्ण स्टैक ट्रेस कॉल साइट पर उपलब्ध नहीं है; यह केवल एक इंटरसेप्टर कॉल के भीतर उपलब्ध है।यूनिटी

public interface IExceptionService 
{ 
    void ThrowEx(); 
} 

public class ExceptionService : IExceptionService 
{ 
    public void ThrowEx() 
    { 
     throw new NotImplementedException(); 
    } 
} 

public class DummyInterceptor : IInterceptionBehavior 
{ 
    public IEnumerable<Type> GetRequiredInterfaces() 
    { 
     return Type.EmptyTypes; 
    } 

    public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext) 
    { 
     IMethodReturn ret = getNext()(input, getNext); 
     if (ret.Exception != null) 
      Console.WriteLine("Interceptor: " + ret.Exception.StackTrace + "\r\n"); 
     return ret; 
    } 

    public bool WillExecute 
    { 
     get { return true; } 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     IUnityContainer container = new UnityContainer(); 
     container.AddNewExtension<Interception>(); 

     container.RegisterType<IExceptionService, ExceptionService>(
      new Interceptor<InterfaceInterceptor>(), 
      new InterceptionBehavior<DummyInterceptor>()); 

     try 
     { 
      container.Resolve<IExceptionService>().ThrowEx(); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("Call Site: " + e.StackTrace); 
     } 

    } 
} 

यहाँ कि कार्यक्रम चलाने से सांत्वना उत्पादन है::

Interceptor: 
at ConsoleDemo.ExceptionService.ThrowEx() in C:\code\ServiceDemo\ConsoleDemo\Program.cs:line 25 
at DynamicModule.ns.Wrapped_IExceptionService_248fe3264f81461f96d34670a0a7d45d.<ThrowEx_DelegateImplementation>__0(IMethodInvocation inputs, GetNextInterceptionBehaviorDelegate getNext) 

Call Site: 
at DynamicModule.ns.Wrapped_IExceptionService_248fe3264f81461f96d34670a0a7d45d.ThrowEx() 
at ConsoleDemo.Program.Main(String[] args) in C:\code\ServiceDemo\ConsoleDemo\Program.cs:line 63 

इंटरसेप्टर में स्टैक ट्रेस ठीक है और सेवा के स्तर पर प्रवेश करने के लिए पर्याप्त होगा

यहाँ एक उदाहरण सेटअप है। हालांकि, हम कॉल साइट पर इंटरसेप्शन प्रॉक्सी कॉल के पीछे सबकुछ खो देते हैं;

मैं सेवा अपवाद में इंटरसेप्टर में अपवाद को लपेट सकता हूं या कुछ ऐसे, और जो आंतरिक अपवाद में कॉल स्टैक रखेगा, लेकिन इससे अजीब लॉगिंग और डीबग निरीक्षण परिदृश्य हो जाता है (हालांकि पूरी तरह से ट्रेस खोने से कम अजीब)।

मैंने यह भी देखा है कि जब हम TransparentProxyInterceptor का उपयोग करते हैं तो हम कम या ज्यादा प्राप्त करते हैं, लेकिन यह InterfaceInterception की तुलना में धीमी होने के रूप में जाना जाता है, और यह कुछ समूहों के लिए अलार्म घंटी ट्रिगर करता है।

क्या प्रॉक्सी पर कॉल साइट पर यूनिटी इंटरसेप्शन के साथ पूर्ण स्टैक ट्रेस पाने का कोई क्लीनर तरीका है?

उत्तर

2

.NET 4.5 में इस उद्देश्य के लिए ExceptionDispatchInfo होगा।

अन्य सभी संस्करणों के लिए आप इस प्रश्न देख सकते हैं:
In C#, how can I rethrow InnerException without losing stack trace?

+0

धन्यवाद, कि इसका जवाब हमारे उद्देश्यों के लिए महान काम करता है! – Nick

+1

@ निक - क्या आप और अधिक कह सकते हैं कि आप क्या कर रहे हैं? –

+0

मेरे पास अब उस कोड तक पहुंच नहीं है, लेकिन यह मेरे मूल प्रश्न में स्वीकृत उत्तर में एसओ लिंक से उदाहरण विधियों (प्रभावी रूप से 'PreserveStackTrace (ret.Exception)' से यहां दिए गए उदाहरणों के लिए 'ret.Exception' पास कर रहा था। ] (http://stackoverflow.com/a/2085377))। मैंने बाद में टिप्पणी स्ट्रिंग में प्रतिबिंब आधारित दृष्टिकोण का भी प्रयास किया, जो .NET 4.0 पर काम कर रहा था। अगर हम अभी भी .NET 4.5 पर चले गए थे, जबकि मैं अभी भी इस पर काम कर रहा था, तो मैं इसके बजाय ExceptionDispatchInfo का उपयोग करना चाहता था। – Nick

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