2009-07-23 29 views
2

私はwinformsアプリケーションを開発していますが、例外処理のベストプラクティスは何かを知りたいと思います。例外が発生するたびに、必要な情報、つまりメッセージとスタックトレースを表示する例外ダイアログを開きます。私が持っている重大な混乱は、ユーザーにフレンドリーなメッセージだけを見せたいと同時に、開発者がデバッグに必要なデータを取得することを確認したい場合です。これを行う最善の方法は何ですか?例外処理とユーザーフレンドリーメッセージ

答えて

2

私は個人的に使用していませんが、Red Gate's Exception Hunterはかなりクールなツールのようです。あなたの最善の策は、ディスクにエラーを記録することです。誰かがそれを見る必要がありますが、ユーザーの方には表示されないようにする必要があります。必要に応じて、(OKをクリックするだけで)Webサイトから例外情報を送信し、トレースをスタックするようユーザーに求めるウィンドウを開くことができます。おそらくパラメータ値を送信しないことを意味する個人情報を送信しないでください。

編集:ああ、「例外とスタックトレース」とは言わないでください。 「エラーが発生しましたが、あなたの助けを借りて迅速に修正することができます。現時点で____にエラー情報を自動的に送信しますか?エラー報告とともに個人情報は送信されません。レポートの詳細情報を表示するには、「詳細」をクリックしてください。詳細をクリックすると、ウィンドウが垂直方向に展開され、データとともに読み込み専用のテキストボックスが表示されます。

0
catch (Exception ex) 
{ 
    cApp.DB.LogException(ex); 
    Messagebox.Show(...); 
} 

cApp.DB.LogException(ex)はデータベースがダウンしていない限り、テキストファイルに追加されます。

0

私はWinFormsで書いたユーティリティプログラムで使用するユーティリティメソッドを持っています。

コンビニエンスオーバーロード:

private void PerformUIAction(Action action) 
{ 
    PerformUIAction(action, (string) null); 
} 

private void PerformUIAction(Action action, string message) 
{ 
    PerformUIAction(action,() => message); 
} 

本物1:の

private void PerformUIAction(Action action, Func<string> messageHandler) 
{ 
    var saveCursor = Cursor; 
    Cursor = Cursors.WaitCursor; 
    try 
    { 
     action(); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(
      messageHandler() ?? ex.Message, 
      "Exception!", 
      MessageBoxButtons.OK, 
      MessageBoxIcon.Error, 
      MessageBoxDefaultButton.Button1, 
      MessageBoxOptions.DefaultDesktopOnly); 
     // Replace with logging code. The important part is ex.ToString(), 
     // not ex.Message 
     Debug.WriteLine(ex.ToString(), "Exception"); 
     throw; 
    } 
    finally 
    { 
     Cursor = saveCursor; 
    } 
} 

例はほとんど注意を払って、それは(専門家は彼らの批判を惜しまないようにしましょう)生産のWinFormsアプリケーションで役に立つかもしれません使用:

private void _samplesMenu_AfterSelect(object sender, TreeViewEventArgs e) 
{ 
    PerformUIAction(
     delegate 
      { 
       // Do the real work of the event in here. 
       // You can reference sender and e 
      }, 
     delegate 
      { 
       return string.Format(
        "Error while processing action {1} for node {0}", 
        e.Node.FullPath, e.Action); 
      }); 
} 
+0

これは単純なtry catchとはどのように違いますか?ある言語構成を別の言語構成に変更して、同じ効果が得られます。 – nawfal

+0

「待機」カーソルが表示され、アクションが実行され、MessageBoxに例外が表示されます。 –

+0

hmmはい私はそれを見落とし、すでに私の解決策でこれを実装しています:P – nawfal

0

あなたの答えをありがとう...私はいくつかのスタックをダンプすると思いますログファイルと私の場合にはユーザーフレンドリーなメッセージが表示されます:)