1

現在、Windows フォーム プログラムのいずれかのフォームで未処理のエラーが発生すると、エンド ユーザーにとって無関係で混乱を招く多くの詳細がダイアログに表示されます。

フォームの 1 つで未処理のエラーが発生したときはいつでも、そのダイアログをより使いやすいダイアログに置き換えたい (そして、タブ付きインターフェイスを使用して非表示にしながら技術的な詳細を利用できるようにしたい)。

このデフォルト ダイアログをカスタム ダイアログに置き換える方法はありますか?

私のアプリケーションは MDI アプリケーションであるため、フォームでエラーが発生した場合は、そのフォームを閉じてわかりやすい方法でエラーを表示し、アプリケーション内の他のウィンドウで動作できるようにしたいと考えています (重大なエラーでない限り)。 )。

4

1 に答える 1

2

いくつかの方法が思い浮かびます。最も簡単な方法は、Application.ThreadException イベントをリッスンして、未処理の例外をすべてキャッチすることです。

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);           
        Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
        Application.Run(new Form1());
    }

    static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
    {
        MessageBox.Show(e.Exception.Message);
    }

ただし、それは単にクラッシュを停止し、mdi フォームを閉じません。送信スレッドを停止すると、mdi フォームが完全に停止します (mdi の外の方が簡単で、サンドボックスで開始できる個別のスレッドでフォームを実行できます)。

私が通常行うことは、すべてのコードをサンドボックス化して実行することです。通常はアクション オブジェクト内にカプセル化されますが、i は単純な手順にすることもできます。

    public static bool Run(Action a)
    {
        try
        {
            a();
            return true;
        }
        catch(Exception ex)
        {
            //custom error handling here
            return false;
        }
    }

呼び出し例:

    private void button1_Click(object sender, EventArgs e)
    {
        Run( ()=>throw new Exception());
    }

標準的な方法で実行すると、待機カーソルまたはロギングとして制御できるという追加の利点があります。mdi 環境でない場合は、いくつかの代替手段がありますが、これが実行可能であることを願っています。

于 2012-06-01T16:32:51.940 に答える