![](https://habrastorage.org/getpro/habr/post_images/136/8be/858/1368be858101794ce9ad571a7dc9b7d4.png)
ご挨拶!
Entity Frameworkのプロファイラーに関する記事で、アプリケーションの例外的なエラーについてユーザーに通知するために使用したフォームについて簡単に説明しました。 サンプルコードのダウンロード数を見積もった後、この例を別のプロジェクトに分け、WPFアプリケーションのサポートを追加することにしました。
ライブラリのソースとサンプルは、無料のMITライセンスの下でCodePlexに公開されています : https : //uiexceptionhandler.codeplex.com/
カットの下の詳細。
はじめに
さまざまな理由でアプリケーションが定期的にクラッシュすることは誰もが知っています。標準のWindowsメッセージの代わりに、アプリケーションでわかりやすいエラーメッセージをユーザーに表示することを強くお勧めします。
どうした
ライブラリが接続されると、アプリケーションがクラッシュした場合、次のメッセージが表示され、エラーの原因となったステップの説明と応答の電子メールアドレスを追加するよう求められますが、エラーテキストはログファイルに保存されます。
![](https://habrastorage.org/getpro/habr/post_images/354/075/a43/354075a43ac8f96b881483c154d71a79.png)
「エラー詳細情報」ボタンをクリックすると、追加のエラー情報が表示されます。
![](https://habrastorage.org/getpro/habr/post_images/2eb/2ea/d0a/2eb2ead0a12774ca0795b41fdeedab57.png)
[デバッグ]ボタンを使用すると、Visual Studioデバッガーを接続できます。
「開発者に送信」ボタンは、開発者にメールを送信します。 メッセージの送信でエラーが発生した場合、ユーザーはログファイルを開発者自身にメールで送信するように求められます。
開発者に送信されるメッセージは、次の形式で送信されます。
![](https://habrastorage.org/getpro/habr/post_images/2f6/9ee/2ba/2f69ee2bac4e99be139b3e09c8da7f79.png)
使用する
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 )
![](https://habrastorage.org/getpro/habr/post_images/bcf/997/621/bcf9976210d9e90b520e976bad70719b.png)
あとがき
このソリューションはかなり大規模なプロジェクト用に作成され、2年以上使用されており、ユーザーからの追加通知なしに各アプリケーションのクラッシュについて即座に学習するため、エラーの修正プロセスが大幅に改善されました。
これが誰かに役立つことを願っています!
ご清聴ありがとうございました!