ホームページ >バックエンド開発 >C++ >C# のさまざまなスレッドでスローされた例外をキャッチするにはどうすればよいですか?

C# のさまざまなスレッドでスローされた例外をキャッチするにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-05 14:54:46237ブラウズ

How to Catch Exceptions Thrown in Different Threads in C#?

異なるスレッドでスローされた例外をキャッチする

マルチスレッド プログラミングでは、スレッド以外のスレッドで発生する例外を処理することが困難な場合があります。メインスレッド。この問題は、1 つのメソッド (Method1) が新しいスレッドを生成し、そのスレッドが例外をスローする別のメソッド (Method2) を実行する場合に発生します。問題は、Method1 内でこの例外をどのようにキャプチャするかです。

.NET 4 以降のソリューション

.NET 4 以降のバージョンの場合、Taskクラスは便利なソリューションを提供します。タスク オブジェクトの .Exceptions プロパティを使用して例外を取得できます。ここでは 2 つのアプローチを示します。

  • タスク スレッドでの例外の処理:

    class Program
    {
        static void Main(string[] args)
        {
            Task<int> task = new Task<int>(Test);
            task.ContinueWith(ExceptionHandler, TaskContinuationOptions.OnlyOnFaulted);
            task.Start();
            Console.ReadLine();
        }
    
        static int Test()
        {
            throw new Exception();
        }
    
        static void ExceptionHandler(Task<int> task)
        {
            var exception = task.Exception;
            Console.WriteLine(exception);
        }
    }
  • タスク スレッドでの例外の処理発信者スレッド:

    class Program
    {
        static void Main(string[] args)
        {
            Task<int> task = new Task<int>(Test);
            task.Start();
    
            try
            {
                task.Wait();
            }
            catch (AggregateException ex)
            {
                Console.WriteLine(ex);
            }
    
            Console.ReadLine();
        }
    
        static int Test()
        {
            throw new Exception();
        }
    }

どちらの場合も、AggregateException が発生しますが、実際の例外には ex.InnerExceptions を通じてアクセスできます。

解決策.NET 3.5 の場合

.NET の場合3.5 では、次のアプローチを使用できます:

  • 子スレッドでの例外の処理:

    class Program
    {
        static void Main(string[] args)
        {
            Exception exception = null;
            Thread thread = new Thread(() => SafeExecute(() => Test(0, 0), Handler));
            thread.Start();
    
            Console.ReadLine();
        }
    
        private static void Handler(Exception exception)
        {
            Console.WriteLine(exception);
        }
    
        private static void SafeExecute(Action test, Action<Exception> handler)
        {
            try
            {
                test.Invoke();
            }
            catch (Exception ex)
            {
                Handler(ex);
            }
        }
    
        static void Test(int a, int b)
        {
            throw new Exception();
        }
    }
  • 呼び出し元での例外の処理スレッド:

    class Program
    {
        static void Main(string[] args)
        {
            Exception exception = null;
            Thread thread = new Thread(() => SafeExecute(() => Test(0, 0), out exception));
    
            thread.Start();
    
            thread.Join();
    
            Console.WriteLine(exception);
    
            Console.ReadLine();
        }
    
        private static void SafeExecute(Action test, out Exception exception)
        {
            exception = null;
    
            try
            {
                test.Invoke();
            }
            catch (Exception ex)
            {
                exception = ex;
            }
        }
    
        static void Test(int a, int b)
        {
            throw new Exception();
        }
    }

これらのオプションは、マルチスレッド シナリオで例外を処理する際の柔軟性を提供し、アプリケーションでの堅牢なエラー管理を保証します。

以上がC# のさまざまなスレッドでスローされた例外をキャッチするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。