1. ホーム
  2. c#

.NET - "catch all exceptions handler "を実装するのに最適な方法は何ですか?

2023-08-27 17:31:43

質問

if all else fails catch it"を持つベストな方法は何なのか、疑問に思っています。

アプリケーションの中でできるだけ多くの例外を処理しているわけですが、それでもバグが発生することは避けられません。 しかし、それでもバグが発生する可能性があります。 そのため、処理されなかった例外をすべてキャッチして、情報を収集し、データベースに保存したり データベースに保存したり、ウェブサービスに送信したりすることができます。

AppDomain.CurrentDomain.UnhandledExceptionイベントはすべてを捕らえるのでしょうか? アプリケーションがマルチスレッドであってもですか?

補足: Windows Vista では、あらゆるアプリケーションがクラッシュ後に自身を回復できるようなネイティブ API 関数が公開されています。 名前が思いつきません......しかし、私たちのユーザーの多くは、この関数を使用しないことを望んでいます。 しかし、私たちのユーザーの多くはまだ Windows XP を使用しているので、それを使用することはできません。

どのように解決するのですか?

AppDomain の UnhandledException の動作で遊んでみたところです。 (これは、未処理の例外が登録される最後の段階です)

はい、イベント ハンドラを処理した後、アプリケーションは終了し、厄介な "... program stopped working dialog" が表示されます。

:) あなたは 今も はそれを避けることができます。

チェックしてみてください。

class Program
{
    void Run()
    {
        AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

        Console.WriteLine("Press enter to exit.");

        do
        {
            (new Thread(delegate()
            {
                throw new ArgumentException("ha-ha");
            })).Start();

        } while (Console.ReadLine().Trim().ToLowerInvariant() == "x");


        Console.WriteLine("last good-bye");
    }

    int r = 0;

    void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        Interlocked.Increment(ref r);
        Console.WriteLine("handled. {0}", r);
        Console.WriteLine("Terminating " + e.IsTerminating.ToString());

        Thread.CurrentThread.IsBackground = true;
        Thread.CurrentThread.Name = "Dead thread";            

        while (true)
            Thread.Sleep(TimeSpan.FromHours(1));
        //Process.GetCurrentProcess().Kill();
    }

    static void Main(string[] args)
    {
        Console.WriteLine("...");
        (new Program()).Run();
    }
}

P.S. Application.ThreadException(WinForms)やDispatcherUnhandledException(WPF)の未処理は上位で処理するようにしてください。