6

だから私は、プログラムから自動的にデータを収集しようとする概念、つまり、何か問題が発生したときにユーザーにレポートを送信するように求めるダイアログ ボックスをポップアップ表示するという概念に納得しています。

私は MS Visual Studio C# で作業しています。

実装の観点から、メインの program.cs ファイルのアプリケーションが実行される場所に try/catch ループを配置することは理にかなっていますか? このような:

        try
        {
            Application.Run(new myMainForm());
        }
        catch (Exception ex)
        {
            //the code to build the report I want to send and to 
            //pop up the Problem Report form and ask the user to send

        }

または、より具体的な例外の種類をキャッチするために、コードの一部に try/catch ループを配置することは理にかなっていますか? (これは新しいアプリケーションであり、より具体的な例外キャッチを入れることは、何がうまくいかないかについての考えを持っていることを意味します...私はそうではありません。それが、上記が私にとって理にかなっているように見える理由です.)

-アディーナ

4

6 に答える 6

9

私はあなたが正しいと思います、あなたは何がうまくいかないのか分からないでしょう、それがポイントです.

ただし、代わりにThreadExceptionイベントにハンドラーを追加することを検討することもできます。

上記のコードは機能しますが、Windows フォーム プログラム内のすべてのコードがメインの Application.Run ループ スレッドで実行されるわけではないため、このようなコードではマルチ スレッドが問題になる場合があります。

リンクされた記事のサンプルコードは次のとおりです。

[STAThread]
static void Main() 
{
   System.Windows.Forms.Application.ThreadException += new ThreadExceptionEventHandler(ReportError);
   System.Windows.Forms.Application.Run(new MainForm());
}

private static void ReportError(object sender, ThreadExceptionEventArgs e)
{
   using (ReportErrorDialog errorDlg = new ReportErrorDialog(e.Exception))
   {
    errorDlg.ShowDialog();
   }
}

MSDNのその他のドキュメント。

些細なことですが、ThreadException イベントを使用すると、例外が致命的でない場合 (フォールト トレランス シナリオなど) にメイン メッセージ ループを実行し続けることができますが、try/catch アプローチではメイン メッセージ ループを再起動する必要がある場合があります。副作用を引き起こします。

于 2008-12-14T17:00:10.317 に答える
1

実装の観点から、メインの program.cs ファイルのアプリケーションが実行される場所に try/catch ループを配置することは理にかなっていますか?

確かに、そしていつも。

例外が発生する可能性のある重要なことを行う場合は、Try/Catch-Blocks を使用する必要があります。

したがって、どのような例外がいつ発生するのか、そのためのパターンに固執することはできません。それ以外の場合、これらは未処理の例外であり、プログラムがクラッシュする可能性があります。

しかし、アプリケーションを完全に停止する必要のない多くの例外があります。これらの例外は、予想どおり飲み込むことができ、アプリケーションを停止する必要はありません。その例は、プログラムでデータを移動またはアクセスするときの UnauthorizedAccessExceptions です。

パフォーマンスのために、Try/Catch-Blocks を必要なだけ小さくし、あまり使用しないようにする必要があります。

プログラムの実行を操作するために Try/Catch を使用するものもあります。これは可能な限り完全に回避する必要があります。例外の発生はパフォーマンス キラー ナンバー 1 であるためです。

于 2008-12-14T17:20:49.027 に答える
1

アプリケーション全体に try catch をラップすると、エラー時にアプリケーションが終了することになります。

各メソッドの周りでトライアンドキャッチを使用するのは維持が困難です。

ベスト プラクティスは、FormatException などの特定の例外の種類をスローし、一般的な例外処理をアプリケーション レベルのイベント ハンドラーに任せるコード ユニットの周りで特定の try キャッチを使用することです。

try
        {
            //Code that could error here
        }
        catch (FormatException ex)
        {
            //Code to tell user of their error
            //all other errors will be handled 
            //by the global error handler
        }

経験は、うまくいかない可能性のあるものの種類を教えてくれます。時間が経つにつれて、アプリがファイル アクセスに関する IO 例外をスローすることがよくあることに気付くでしょう。そのため、後でこれらをキャッチして、ユーザーに詳細な情報を提供できます。

エラーのグローバル ハンドラーは、他のすべてをキャッチします。これらを使用するには、イベント ハンドラーを System.Windows.Forms.Application.ThreadException ( MSDN を参照) と AppDomain.UnhandledException ( MSDN を参照)の 2 つのイベントに接続します。

Out of Memory 例外と StackOverflowException は、エラー キャッチによってキャッチされない場合があることに注意してください。

于 2008-12-14T17:26:04.337 に答える
1

スタック トレースを自動的に取得したい場合、Microsoft は、エラー報告サービスを介してそれらを送信することを許可しています。VeriSign からデジタル証明書にサインアップし、Microsoft に (無料で) 登録するだけです。

次に、Microsoft は、Web サイトからミニダンプをダウンロードするためのログインを提供します。ミニダンプは、ユーザーが [エラー レポートの送信] をクリックすると送信されます。

「送信しない」をクリックすることもできますが、少なくともこれは Microsoft のダイアログ ボックスであり、おそらく自分でコーディングする必要はありません。24 時間年中無休で実行され、Web サーバーのアップタイムを心配する必要がなく、ユーザーに回避策の詳細を送信でき、Windows Update を介して更新を配信できます。

このサービスに関する情報は、この記事「Windows エラー報告: はじめに」にあります。

于 2009-08-11T10:30:29.780 に答える
0

クラッシュをキャプチャするだけの場合は、すべてのエラーを無視して、DrWatson にミニダンプを生成させます。次に、それをデバッガーで確認できます (ミニダンプには windbg が推奨されます)。コードが間違っていた行と、すべてのパラメーター、スタック トレース、およびレジスターが表示されます。Drwatson を設定してフル ダンプを生成し、メモリ コア ダンプ全体を取得して調査することができます。

アプリがユーザーの前で「クラッシュ」しないようにする場合を除き、アプリ全体に try/catch を配置することはお勧めしません。例外は常に処理され、おそらく無視されます。その点。

ミニダンプをあなたに送信することは別の問題ですが、ここに記事があります。電子メール/http/ftp/などで送信するには、いくつかの作業を行う必要があります。

于 2008-12-14T20:12:21.770 に答える
0

最善の方法は 、アプリケーションのメイン関数でAppDomain.UnhandledExceptionApplication.ThreadExceptionを登録することです。これにより、アプリケーションで未処理の例外を記録できます。try catch ブロックで run をラップしても、すべてがキャッチされるわけではありません。

于 2008-12-14T17:57:58.530 に答える