WinFormsおよびWPFアプリケーションのエラーメッセージウィンドウ



ご挨拶!



Entity Frameworkのプロファイラーに関する記事で、アプリケーションの例外的なエラーについてユーザーに通知するために使用したフォームについて簡単に説明しました。 サンプルコードのダウンロード数を見積もった後、この例を別のプロジェクトに分け、WPFアプリケーションのサポートを追加することにしました。

ライブラリのソースとサンプルは、無料のMITライセンスの下でCodePlexに公開されていますhttps : //uiexceptionhandler.codeplex.com/



カットの下の詳細。



はじめに


さまざまな理由でアプリケーションが定期的にクラッシュすることは誰もが知っています。標準のWindowsメッセージの代わりに、アプリケーションでわかりやすいエラーメッセージをユーザーに表示することを強くお勧めします。



どうした


ライブラリが接続されると、アプリケーションがクラッシュした場合、次のメッセージが表示され、エラーの原因となったステップの説明と応答の電子メールアドレスを追加するよう求められますが、エラーテキストはログファイルに保存されます。





「エラー詳細情報」ボタンをクリックすると、追加のエラー情報が表示されます。





[デバッグ]ボタンを使用すると、Visual Studioデバッガーを接続できます。

「開発者に送信」ボタンは、開発者にメールを送信します。 メッセージの送信でエラーが発生した場合、ユーザーはログファイルを開発者自身にメールで送信するように求められます。

開発者に送信されるメッセージは、次の形式で送信されます。





使用する


1.最新のコードhttps://uiexceptionhandler.codeplex.com/SourceControl/latestを取得します

2.リリースモードでアセンブルします。

3.「UIExceptionHandlerLibs \ Deploy」フォルダーから、WinFormsアプリケーションの場合はUIExceptionHandlerWinForms.dllライブラリーを、WPFアプリケーションの場合はUIExceptionHandlerWPF.dllをプロジェクトに接続します。

4.いくつかのパラメーターを使用して静的メソッドを呼び出して初期化します。

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





仕組み


静的UIException.Startメソッドは、HandleErrorメソッドをAppDomain.CurrentDomain.UnhandledExceptionイベントにサブスクライブします。

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





HandleErrorメソッド:

 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; }
      
      





プロジェクトへの最大限のシンプルな統合を実現するために、使用したすべてのアセンブリを1つのライブラリに結合することにしました。 これは、 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