2010-08-09 10 views
5

क्या नेट फ्रेमवर्क में कोई भी घटना है जो अपवाद पर निकाल दी जाती है। जब भी कोई अपवाद पकड़ा जाता है, तो मुझे इसे लॉग इन करने की आवश्यकता होती है। तो यदि कोई घटना मौजूद है, तो मैं उस पर सब्सक्राइब कर सकता हूं और ईवेंट हैंडलर में छोड़कर लॉग इन कर सकता हूं।क्या कोई ऐसा ईवेंट है जो अपवाद होने पर ट्रिगर हो जाता है?

उत्तर

2

Exception के अलावा? मैं अपने लॉगिंग मॉड्यूल में अपने catch ब्लॉक में बस एक कॉल जोड़ूंगा।

कुछ की तरह:

catch(YourException ex) 
{ 
    LogMyException(ex, [otherParamsYouNeed]); 
    //Other Exception Handling 
} 

आप, सफलता या विफलता की परवाह किए बिना कुछ की स्थिति के लिए लॉग इन इस http://www.switchonthecode.com/tutorials/csharp-tutorial-dealing-with-unhandled-exceptions UnhandledExceptionEventHandler पर finally{}

0

नज़र उपयोग करना चाहते हैं क्या आप इस के लिए देख रहे हैं खिड़कियों के साथ है लेकिन मुझे लगता है कि वेब के लिए भी इसी तरह के विचार हैं
सर्वश्रेष्ठ सादर,
Iordan

+0

वेब समतुल्य है HttpAplication.Error http://msdn.microsoft.com/en-us/library/system.web.httpapplication.error.aspx –

1

WinForms में आपके पास Application.ThreadException ईवेंट है और अधिक सामान्य AppDomain.CurrentDomain.UnhandledException ईवेंट है।

लेकिन कृपया ध्यान दें कि इन अपवादों को लॉग करने के बाद सलाह दी गई है कि वह आवेदन बंद कर दे। यह अब एक स्थिर स्थिति में नहीं हो सकता है।

+0

+1, ये हैंडलर अनचाहे अपवादों को लॉग इन करने के लिए सबसे अच्छी जगह हैं परिणामस्वरूप आवेदन की समाप्ति होगी। मुझे लगता है कि विफलता के बिंदु के करीब 'लॉग और रीथ्रो' की तुलना में यह बहुत साफ है, क्योंकि .NET अपवाद वर्ग पहले से ही स्टैकट्रेस जैसी प्रासंगिक जानकारी को संरक्षित करता है। –

1

AppDomain वर्ग एक UnhandledException घटना है, लेकिन मुझे नहीं लगता कि आप किसी भी अपवाद फेंक जा रहा है की सदस्यता ले सकते हैं।

AppDomain.CurrentDomain.UnhandledException += YourHandler 

जानकारी के लिए:: -

6

हाँ वहाँ AppDomain वस्तु पर UnhandledException घटना है आप केवल एक अंतिम उपाय के रूप में इन संचालकों का उपयोग करना चाहिए - यह एक trycatch ब्लॉक में अपवाद को पकड़ने के लिए कहीं बेहतर है, हालांकि यह हमेशा संभव नहीं हो सकता (मामले में उदाहरण के लिए जब 3 पार्टी कोड नया सूत्र शुरू होता है)

इसके अलावा, इस घटना केवल सक्रिय होने का एक अपवाद बिना क्रिया है जब - मेरी जानकारी के लिए वहाँ होने का कोई रास्ता नहीं है प्रक्रिया में डीबगर संलग्न किए बिना इस तरह से पकड़े गए कार्यक्रमों की अधिसूचना।

+0

+1 "आपको केवल इन हैंडलरों को अंतिम उपाय के रूप में उपयोग करना चाहिए", मैं अपवाद लॉग करने के लिए इसका उपयोग करता हूं, उपयोगकर्ता को सूचित करता हूं और केवल ऐप को पुनरारंभ करता हूं।अन्यथा आप सभी प्रकार की समस्याओं में आ सकते हैं। –

+0

यह प्रलेखन से स्पष्ट नहीं है, लेकिन ऐसा नहीं लगता है कि इस घटना की सदस्यता लेने से आपको ऐपडोमेन के बंद होने से रोकने का कोई मौका मिलता है। –

0

एएसपी.नेट में, पृष्ठ त्रुटि पर पृष्ठ स्तर पर अनचाहे अपवादों को पृष्ठ स्तर पर या एप्लिकेशन स्तर (वैश्विक.एक्सएक्स में, या IHttpModule कार्यान्वयन में) अनुप्रयोग त्रुटि घटनाओं को संभालने से पकड़ा जा सकता है। , आप एक लिख सकते हैं

Exception ex = HttpContext.Current.Server.GetLastError(); 
4

आप PostSharp के साथ कुछ पहलू उन्मुख प्रोग्रामिंग कर रही पर एक नजर है चाहिए: इन घटनाओं ताकि आप अपवाद प्राप्त करने के लिए सर्वर कॉल करने के लिए की आवश्यकता होगी, वास्तविक अपवाद आप देना नहीं है सरल लॉग विशेषता और इसे अपनी पूरी असेंबली पर लागू करें।

आपको बस कुछ इस तरह है:

[Serializable] 
public class LogAttribute : OnMethodInvocationAspect 
{ 
    public override void OnInvocation(MethodInvocationEventArgs eventArgs) 
    { 
     try 
     { 
     eventArgs.Proceed(); 
     } 
     catch(Exception ex) 
     { 
     // log exception here 
     } 
    } 
} 

और अपने विधानसभा में इसे लागू:

[assembly: Log] 
public class ... 

यह चाय की हर किसी के कप नहीं है, लेकिन मैं इसे एक बहुत साफ मिल गया है, मेरे वर्गों में बहुत सारे बॉयलरप्लेट कोड से बचने के लिए साफ-सुथरा तरीका और मुझे परियोजना से संबंधित अधिक कार्यक्षमताओं पर काम करने के लिए स्वतंत्र करता है।

अद्यतन: के रूप में Kugel टिप्पणी में बताया, यह आप पर नज़र रखने और विधि के निष्पादन के दौरान फेंका किसी भी अपवाद लॉग इन करने में मदद मिलेगी, लेकिन अगर आप राज्य विधि आप की आवश्यकता होगी करने के लिए आंतरिक प्रवेश करना चाहते हैं इससे थोड़ा और काम करो।

उदाहरण के लिए, आपको अभी भी अपनी विधि के अंदर प्रयास/पकड़ने की आवश्यकता हो सकती है, जिसका उपयोग आप अपनी कक्षा में रुचि रखने वाले अपवादों को पकड़ने के लिए कर सकते हैं और शायद उन्हें कस्टम अपवाद ऑब्जेक्ट में भी लपेट सकते हैं ताकि आप अधिक उपयोगी जानकारी जोड़ना शुरू कर सकें एक त्रुटि कोड की तरह, आदि। इतने लंबे समय तक आपके कस्टम अपवाद में 'संदेश' संपत्ति, उदाहरण के लिए एक उपयुक्त तंत्र है

catch (Exception ex) 
{ 
    // log error 
    log.Error(ex); 

    // handle exception, rethrow, etc. 
    ... 
} 

क्षमा करें यह होता जा रहा है एक सा घना ..

+0

फिर भी यदि आप किसी विधि के अंदर किसी राज्य को लॉग करना चाहते हैं, तो यह आपकी सहायता नहीं करेगा। – Kugel

+1

लॉगिंग के बाद बस 'फेंक' शामिल करना सुनिश्चित करें। –

0

करने के लिए:

public class DictionaryKeyNotValidException() : Exception 
{ 
    public DictionaryKeyNotValidException(string key) 
     : base(GetMessage(key)) 
    { 
    } 

    public ErrorEnum ErrorCode { get { return ErrorEnum.InvalidDictionaryKey; } } 

    private string GetMessage(string key) 
    { 
     return string.Format("ERROR {0} : Invalid dictionary key encountered {1}", 
          ErrorCode.GetHashCode(), key); 
    } 
} 
अपनी लॉग विशेषता में

तो, आप उपयोग कर रहे log4net, तो आप और अधिक उपयोगी जानकारी लॉग इन करने शुरू कर सकते हैं प्रदान की Theburningmonk द्वारा दिए गए उत्तर पर विस्तार करें, आप log4PostSharp का उपयोग करने का भी प्रयास कर सकते हैं। यह प्री-बिल्ट कोड है जो लॉगिंग फ्रेमवर्क के साथ काम करने वाले लॉगिंग कोड को सम्मिलित करने के लिए PostSharp का उपयोग करता है।

अन्य चीजों के अलावा यह स्वचालित रूप से आपके तरीकों में कोड जोड़ देगा जो अपवादों को पकड़ता है और उन्हें लॉग करता है।

यह सब इस बात पर निर्भर करता है कि क्या आप log4net लॉगिंग फ्रेमवर्क का उपयोग करने में खुश हैं या इसे स्वयं करना पसंद करेंगे।

0

vb.net में, कोई कैच स्टेटमेंट के लिए "कब" क्वालीफायर जोड़ सकता है (उदाहरण के लिए 'ऑब्जेक्ट डिस्प्ले अप एक्सेप्शन के रूप में एक्स को हटाएं जब Ex.Message.Contains ("क्षमा करें")')। इसका उपयोग लॉगऑप्स लॉगिंग के लिए किया जा सकता है (उदा। 'लॉगिंग फ़ंक्शनशनटैटरेट्सफल्स (एक्स)' अपवाद के रूप में एक्स को अपवाद नहीं करेगा, लेकिन उन्हें सभी लॉग इन करेंगे) और ऐसा लगता है कि सी # में उपयोगी होगा। आखिरकार मैंने सुना, यह सुविधा केवल vb.net में उपलब्ध थी (यह सुनिश्चित नहीं है कि क्या होगा यदि vb.net में ऐसी सुविधा का उपयोग करके कोड संकलित किया गया हो और सी # को डीकंपल किया गया हो)।

+0

यह सही है: यह उन सीएलआर सुविधाओं में से एक है जो सी # खुलासा नहीं करता है। आप सभी 'ऑब्जेक्ट डिस्प्ले अपवाद' को पकड़कर, 'संदेश' की जांच करके और 'थ्रो' के साथ पुनर्विचार करके कुछ समान कर सकते हैं; यदि यह वह नहीं है जिसे आप ढूंढ रहे थे। यह सुनिश्चित नहीं है कि यह प्रदर्शन में तुलना कैसे करता है, लेकिन फिर, यह एक अपवाद है जो परवाह करता है? –

+0

@ स्टेवन सूडिट: जब डिबगिंग करते हैं, तो एक अपवाद अपवाद निष्पादन तोड़ देगा जहां इसे फेंक दिया जाता है; एक पकड़ा गया और पुनर्विचार अपवाद निष्पादन तोड़ देगा जहां इसे पुनर्स्थापित किया जाएगा। – supercat

+0

मैं इनकार नहीं कर सकता कि डीबगर के तहत चलने पर मतभेद हैं, लेकिन मैं अपना कोड नहीं लिखता हूं ताकि कभी भी अपवाद अपवाद न हों। सबसे बुरे मामले में, शीर्ष-स्तरीय पकड़ ब्लॉक लॉग और बाहर निकलता है। –

0

आप ग्लोबल.एक्सएक्स एप्लिकेशन_इरर इवेंट में कुछ डाल सकते हैं।

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

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

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