दिलचस्प पोस्ट
क्या आप MySQL में तालिका नामों के रूप में संख्याओं का उपयोग करने की अनुमति देते हैं? अजगर माप्प्लेटिब एनीमेशन में रोक / शुरू / रोकें थ्रैड इन पथ्रेड लाइब्रेरी जावास्क्रिप्ट आराम क्लाइंट लाइब्रेरी सी ++ में यूनिकोड प्रोसेसिंग क्या विज़ुअल स्टूडियो 2012 को साइड-बाय-साइड वाई / विज़ुअल स्टूडियो 2010 स्थापित किया जा सकता है? क्लास द्वारा jQuery का गिनती तत्व; इसे लागू करने का सबसे अच्छा तरीका क्या है? HttpWebRequest का उपयोग करके डाक डेटा पोस्ट करें PHP, मैं कैसे जांच सकता हूं कि कोई फ़ाइल एमपी 3 या छवि फ़ाइल है? पायथन की डिफ़ॉल्ट एन्कोडिंग बदल रहा है? मोंगोज़ – एक्जिक फ़ंक्शन क्या करता है? पाठ हाइलाइट इवेंट पर? क्या मैं जावा में रनटाइम पर गणना के तत्व जोड़ और हटा सकता हूं? जावास्क्रिप्ट: स्ट्रिंग के रूप में पथ का रास्ता देकर वस्तु से गहरे मूल्य प्राप्त करें jqGrid: स्थानीय डेटाटाइप के साथ नेस्टेड उप ग्रिड लोड करने का मुद्दा

वैश्विक रूप से एक WPF अनुप्रयोग में अपवाद पकड़?

हम एक WPF आवेदन कर रहे हैं, जहां के भाग में रनटाइम पर अपवाद फेंक सकते हैं। मैं विश्वव्यापी किसी भी अप्रतिबंधित अपवाद को पकड़ने और उन्हें लॉग इन करना चाहता हूं, लेकिन अन्यथा प्रोग्राम निष्पादन को जारी रखता हूं, जैसे कि कुछ नहीं हुआ (जैसे वीबी की On Error Resume Next जैसे थोड़े)।

सी # में यह संभव है? और यदि हां, तो मुझे अपवाद हैंडलिंग कोड लगाने की ज़रूरत है?

वर्तमान में मैं किसी एक बिंदु को नहीं देख सकता जहां मैं try कर सकता / catch हूं और जो सभी अपवाद उत्पन्न हो सकते हैं। और फिर भी मैं कैच के कारण जो कुछ भी निष्पादित किया गया था छोड़ दिया होता। या क्या मैं यहां गलत तरीके से गलत दिशाओं में सोच रहा हूं?

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

अपवादों को पकड़े जाने के लिए: मैं उन्हें लॉग फ़ाइल में लॉग इन करता हूं, जिसमें संपूर्ण स्टैक ट्रेस भी शामिल है। यही व्यायाम का पूरा मुद्दा था बस उन लोगों का मुकाबला करने के लिए जो कि VB के ओरेन को मेरे सादृश्य को भी सचमुच ले रहे थे।

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

आवेदन के तात्कालिक उपयोग के लिए अपवाद पर हो सकता है कि बहुत सी चीजें नहीं हैं:

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

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

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

साइड नोट: उस एप्लिकेशन के लिए बिल्कुल एक उपयोगकर्ता है यह विंडोज या ऑफिस का ऐसा कुछ नहीं है, जो कि लाखों लोगों द्वारा उपयोग किया जाता है, जहां उपयोगकर्ताओं को बुलबुले के अपवाद होने की लागत पहले से पहले ही बहुत अलग होगी।

Solutions Collecting From Web of "वैश्विक रूप से एक WPF अनुप्रयोग में अपवाद पकड़?"

Application.DispatcherUnhandledException Event उपयोग करें। Application.DispatcherUnhandledException Event सारांश के लिए इस प्रश्न को देखें ( ड्राउन नोकेस का उत्तर देखें )।

ध्यान रखें कि अभी भी अपवाद हैं जो आपके आवेदन को सफलतापूर्वक शुरू करने से रोकते हैं, जैसे स्टैक अतिप्रवाह, थका हुआ स्मृति, या खोया नेटवर्क कनेक्टिविटी जब आप डेटाबेस को सहेजने की कोशिश कर रहे हैं।

AppDomain.UnhandledException ईवेंट

यह इवेंट बिना किसी अपवाद के अधिसूचना प्रदान करता है। यह सिस्टम अपवाद के बारे में जानकारी लॉग करने की अनुमति देता है इससे पहले सिस्टम डिफ़ॉल्ट हैंडलर उपयोगकर्ता को अपवाद की रिपोर्ट करता है और एप्लिकेशन को समाप्त करता है।

  public App() { AppDomain currentDomain = AppDomain.CurrentDomain; currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler); } static void MyHandler(object sender, UnhandledExceptionEventArgs args) { Exception e = (Exception) args.ExceptionObject; Console.WriteLine("MyHandler caught : " + e.Message); Console.WriteLine("Runtime terminating: {0}", args.IsTerminating); } 

यदि अनियंत्रित अपवाद घटना को डिफ़ॉल्ट अनुप्रयोग डोमेन में संभाला जाता है, तो यह किसी भी थ्रेड में किसी भी अप्रतिबंधित अपवाद के लिए उठाया जाता है, चाहे कोई भी अनुप्रयोग डोमेन थ्रेड को प्रारंभ हो। यदि थ्रेड किसी अनुप्रयोग डोमेन में शुरू हुआ जिसमें अनहंड अपवाद के लिए एक ईवेंट हैंडलर है, घटना उस डोमेन अनुप्रयोग में उठाया गया है यदि वह अनुप्रयोग डोमेन डिफ़ॉल्ट एप्लिकेशन डोमेन नहीं है, और डिफ़ॉल्ट एप्लिकेशन डोमेन में कोई ईवेंट हैंडलर भी है, तो ईवेंट दोनों डोमेन में उठाया गया है

उदाहरण के लिए, मान लीजिए कि एक थ्रेड एप्लिकेशन डोमेन "एडी 1" में शुरू होता है, एडिशन डोमेन "एडी 2" में एक विधि को कॉल करता है, और वहां से ऐड्रेंस डोमेन "एडी 3" में एक विधि कॉल करता है, जहां वह अपवाद फेंकता है। पहला आवेदन डोमेन जिसमें अनचाहे अपवाद घटना को उठाया जा सकता है "एडी 1" है यदि वह अनुप्रयोग डोमेन डिफ़ॉल्ट एप्लिकेशन डोमेन नहीं है, तो ईवेंट को डिफ़ॉल्ट ऐप्लिकेशन डोमेन में भी उठाया जा सकता है।

इसके अलावा, जो अन्य लोगों ने यहां उल्लेख किया है, ध्यान दें कि Application.DispatcherUnhandledException संयोजन। डिस्पाचर अनैन्डल्ड अपेशन (और इसके समरूप ) के साथ

 <configuration> <runtime> <legacyUnhandledExceptionPolicy enabled="1"/> </runtime> </configuration> 

app.config में एप्लिकेशन को बंद करने से आपके माध्यमिक थ्रेड्स अपवाद को रोक देगा।

यहां NLog का उपयोग करने के लिए पूर्ण उदाहरण है

 using NLog; using System; using System.Windows; namespace MyApp { /// <summary> /// Interaction logic for App.xaml /// </summary> public partial class App : Application { private static Logger logger = LogManager.GetCurrentClassLogger(); public App() { var currentDomain = AppDomain.CurrentDomain; currentDomain.UnhandledException += CurrentDomain_UnhandledException; } private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { var ex = (Exception)e.ExceptionObject; logger.Error("UnhandledException caught : " + ex.Message); logger.Error("UnhandledException StackTrace : " + ex.StackTrace); logger.Fatal("Runtime terminating: {0}", e.IsTerminating); } } } 

एनओएलॉग का उपयोग करते हुए उदाहरण कोड, जो एप्पडोमेन में सभी थ्रेड्स से UI प्रेषक थ्रेड से और एएससिंक फ़ंक्शंस से फेंकने के अपवादों को पकड़ेगा:

App.xaml.cs:

 public partial class App : Application { private static Logger _logger = LogManager.GetCurrentClassLogger(); protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); SetupExceptionHandling(); } private void SetupExceptionHandling() { AppDomain.CurrentDomain.UnhandledException += (s, e) => LogUnhandledException((Exception)e.ExceptionObject, "AppDomain.CurrentDomain.UnhandledException"); DispatcherUnhandledException += (s, e) => LogUnhandledException(e.Exception, "Application.Current.DispatcherUnhandledException"); TaskScheduler.UnobservedTaskException += (s, e) => LogUnhandledException(e.Exception, "TaskScheduler.UnobservedTaskException"); } private void LogUnhandledException(Exception exception, string source) { string message = $"Unhandled exception ({source})"; try { System.Reflection.AssemblyName assemblyName = System.Reflection.Assembly.GetExecutingAssembly().GetName(); message = string.Format("Unhandled exception in {0} v{1}", assemblyName.Name, assemblyName.Version); } catch (Exception ex) { _logger.Error(ex, "Exception in LogUnhandledException"); } finally { _logger.Error(exception, message); } } 

जैसे "वीबी के बाद त्रुटि फिर से शुरू करें?" यह डरावना की तरह लगता है पहली सिफारिश यह नहीं है। दूसरी सिफारिश यह नहीं करती है और इसके बारे में नहीं सोचती। आपको अपने दोषों को बेहतर ढंग से अलग करने की आवश्यकता है इस समस्या के दृष्टिकोण के अनुसार, यह इस बात पर निर्भर करता है कि आप कोड कैसे संरचित हैं यदि आप MVC जैसे पैटर्न का उपयोग कर रहे हैं या फिर यह बहुत मुश्किल नहीं होना चाहिए और निश्चित रूप से एक वैश्विक अपवाद स्वेनर की आवश्यकता नहीं होगी दूसरे, एक अच्छा लॉगिंग पुस्तकालय जैसे log4net या ट्रेसिंग का उपयोग करें। हमें अधिक विवरण जानने की आवश्यकता होगी जैसे आप किस प्रकार के अपवादों के बारे में बात कर रहे हैं और आपके आवेदन के किन भागों में फेंक दिया जा रहा अपवाद हो सकता है