WinForms और WPF अनुप्रयोगों के लिए त्रुटि संदेश विंडो



नमस्ते!



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

उदाहरण के साथ पुस्तकालय स्रोत मुक्त एमआईटी लाइसेंस के तहत कोडप्लेक्स पर प्रकाशित होते हैं: https://uiexceptionhandler.codexx.com/



कट के तहत विवरण।



परिचय


हर कोई जानता है कि एप्लिकेशन कई कारणों से समय-समय पर दुर्घटनाग्रस्त हो जाते हैं, और मानक विंडोज संदेश के बजाय उपयोगकर्ता को एप्लिकेशन में मैत्रीपूर्ण त्रुटि संदेश दिखाना अत्यधिक उचित है।



क्या हुआ?


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





"त्रुटि विवरण जानकारी" बटन पर क्लिक करने पर, अतिरिक्त त्रुटि जानकारी प्रदर्शित होती है:





डीबग बटन आपको विज़ुअल स्टूडियो डीबगर से कनेक्ट करने की अनुमति देता है।

“Send to Developer” बटन डेवलपर को एक ईमेल भेजता है। संदेश भेजने में त्रुटि के मामले में, उपयोगकर्ता को मेल द्वारा डेवलपर को लॉग फ़ाइल भेजने के लिए कहा जाएगा।

डेवलपर को भेजा गया संदेश निम्नलिखित रूप में आएगा:





के उपयोग


1. नवीनतम कोड https://uiexceptionhandler.codeplex.com/SourceControl/latest चुनें

2. रिलीज मोड में इकट्ठा करें।

3. "UIExceptionHandlerLibs \ Deploy" फ़ोल्डर से, WinForms एप्लिकेशन और UIExceptionHandlerWFF.dll के मामले में UIExceptionHandlerWinForms.dll लाइब्रेरी को प्रोजेक्ट में WPF एप्लिकेशन के मामले में कनेक्ट करें।

4. कई मापदंडों के साथ एक स्थिर विधि कहकर आरंभ करें:

UIException.Start( string serverSmtp, int portSmtp, string passwdSmtp, string userSmtp, string programmerEmail, string fromEmail, string subject )
      
      





यह कैसे काम करता है


स्थिर UIException.Start विधि AppDomain.CurrentDomain.UnhandledException घटना के लिए हैंडल विधि की सदस्यता लेती है:

 AppDomain.CurrentDomain.UnhandledException += (sender, e) => HandleError((Exception)e.ExceptionObject);
      
      





संभाल विधि:

 private static void HandleError(Exception exception) { try { //             IErrorHandlerForm new ErrorHandlerController(exception, new ErrorHandlerForm()).Run(); } catch (Exception e) { //      LogHelper.Logger.Error(e); //               MessageBox.Show("Error processing exception. Please send log file " + LogHelper.ExceptionLogFileName + " to developer: " + Settings.ProgrammerEmail + " \r\n Exception:" + e); //      if (MessageBox.Show("Attach debugger? \n Only for developer!!!", "Debugging...", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes) { Debugger.Launch(); throw; } } finally { //     windows       Environment.Exit(1); } }
      
      





IErrorHandlerForm इंटरफ़ेस:

 public interface IErrorHandlerForm { event Action OnSendButtonClick; event Action OnShowErrorLinkClick; event Action OnLogFileLinkClick; event Action OnDebugButtonClick; //    void SetHeight(int height); //      string ExceptionInfoText { get; set; } //         string ExceptionDetailText { get; set; } // email    string ReplyEmail { get; } void ShowExceptionInfoTextBox(bool isShow); //    void ShowInfoMessageBox( string text, string caption); //    bool ShowQuestionDialog( string text, string caption); //     !          finaly void ShowViewDialog(); void UpdateContactEmail(string contactEmail); }
      
      





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

 private static void ConfigureNlog() { var config = new LoggingConfiguration(); var fileTarget = new FileTarget(); config.AddTarget("file", fileTarget); fileTarget.Layout = @"${longdate} ${message}"; fileTarget.FileName = "${basedir}/" + ExceptionLogFileName; var rule2 = new LoggingRule("*", LogLevel.Trace, fileTarget); config.LoggingRules.Add(rule2); LogManager.Configuration = config; }
      
      





परियोजना में अधिकतम सरल एकीकरण प्राप्त करने के लिए, मैंने सभी प्रयुक्त विधानसभाओं को एक पुस्तकालय में संयोजित करने का निर्णय लिया। यह ILMerge एप्लिकेशन का उपयोग करके, पोस्ट-बिल्ड इवेंट में स्क्रिप्ट जोड़ने के द्वारा किया जाता है:

 if $(ConfigurationName) == Release ( "$(SolutionDir)ILMerge\ILMerge.exe" /out:"$(SolutionDir)Deploy\$(TargetFileName)" "$(TargetDir)*.dll" /target:dll /targetplatform:v4,C:\Windows\Microsoft.NET\Framework64\v4.0.30319 /wildcards )
      
      









अंतभाषण


यह समाधान एक काफी बड़ी परियोजना के लिए लिखा गया था, इसका उपयोग 2 वर्षों से अधिक के लिए किया गया है, त्रुटियों को ठीक करने की प्रक्रिया में काफी सुधार हुआ है, क्योंकि आप प्रत्येक एप्लिकेशन क्रैश के बारे में तुरंत सीखते हैं, उपयोगकर्ता से अतिरिक्त अधिसूचना के बिना।



मुझे आशा है कि यह किसी के लिए उपयोगी होगा!

आपका ध्यान देने के लिए आप सभी का धन्यवाद!



All Articles