22

私はC#が初めてです。私は小さなデスクトップ フォーム ベースのアプリケーションを作成しており、アプリにこの機能が必要です。

アプリケーションがいつでもクラッシュした場合、アプリがスタック トレースを収集して私に送り返す最後の機会があるはずです...

この道順を教えてください。

アプリのメイン エントリ ポイントをカバーする try catch が必要ですか?? または、C#アプリでそのようなことを処理する最良の方法は何ですか.

ありがとうございました、

4

4 に答える 4

33

すべての未処理の例外をキャッチするには、これを program.cs に追加します。

    [STAThread]
    static void Main()
    {
    AppDomain currentDomain = default(AppDomain);
    currentDomain = AppDomain.CurrentDomain;
    // Handler for unhandled exceptions.
    currentDomain.UnhandledException += GlobalUnhandledExceptionHandler;
    // Handler for exceptions in threads behind forms.
    System.Windows.Forms.Application.ThreadException += GlobalThreadExceptionHandler;
    ...
    }

private static void GlobalUnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs e)
{
   Exception ex = default(Exception);
   ex = (Exception)e.ExceptionObject;
   ILog log = LogManager.GetLogger(typeof(Program));
   log.Error(ex.Message + "\n" + ex.StackTrace);
}

private static void GlobalThreadExceptionHandler(object sender, System.Threading.ThreadExceptionEventArgs e)
{
   Exception ex = default(Exception);
   ex = e.Exception;
   ILog log = LogManager.GetLogger(typeof(Program)); //Log4NET
   log.Error(ex.Message + "\n" + ex.StackTrace);
}

exception.StackTraceで取得できるスタックトレース

于 2012-04-18T04:57:05.643 に答える
4

私があなたなら、無料でオープンソースの NBug フレームワークなどのオールインワン ソリューションを検討します。

http://nbug.codeplex.com/

于 2012-04-18T05:03:04.973 に答える
3

自動例外レポート機能を備えた Crypto Obfuscator をご覧ください。

自動例外レポートを使用すると、ソフトウェアで発生する未処理の例外を非常に簡単にキャッチでき、ユーザーはボタンを 1 回クリックするだけでこれらの例外を簡単に報告できます。

例外レポートには、すべてのメソッド引数とローカル変数の値に加えて、システム情報、例外の時間、ビルド番号、ログ ファイルやスクリーンショットなどのオプションの開発者定義のカスタム データに加えて、完全なスタック トレース情報を含むすべての関連情報が含まれます。など

免責事項: 私は、Crypto Obfuscator の開発者である LogicNP Software で働いています。

于 2012-04-18T05:31:06.940 に答える
1

コードを try-catch でラップし、例外が発生した場合、例外に到達してスタック トレースを確認できます。はい、try-catch を追加してメイン エントリ ポイントをラップします。

try
{
    MainEntryPoint();
}
catch (Exception exc)
{
   System.Diagnostics.Debug.Print(exc.Message);  // get at entire error message w/ stacktrace
   System.Diagnostics.Debug.Print(exc.StackTrace);  // or just the stacktrace
}
于 2012-04-18T05:00:16.633 に答える