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

.NET の別のスレッドからスローされた例外をキャッチするにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2025-01-06 00:49:39
オリジナル
167 人が閲覧しました

How Can I Catch Exceptions Thrown from a Separate Thread in .NET?

別のスレッドでスローされた例外のキャッチ: 総合ガイド

この記事では、呼び出しスレッドとは別のスレッドで発生した例外をキャプチャするという一般的な問題について説明します。方法。この問題は、メソッド (Method1) が新しいスレッドを生成し、そのスレッド (Method2) での実行中に例外が発生した場合に発生します。課題は、この例外情報を Method1 に送信することにあります。

解決策

.NET 4 以降のバージョンでは、タスククラスはエレガントなソリューションを提供します。このクラスを使用すると、次のことが可能になります。

1.タスクのスレッドでの個別の例外処理

このアプローチでは、次のコード スニペットに示すように、タスクのスレッドで例外を処理できます。

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);
    }
}
ログイン後にコピー

2.呼び出し元のスレッドで例外を処理する

または、次のコードを使用して呼び出し元のスレッドで例外を処理できます。

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 に格納されている実際の例外property.

.NET 3.5 ソリューション

.NET 3.5 には、次の 2 つのアプローチがあります。

1.子スレッドでの例外処理

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();
    }
}
ログイン後にコピー

2.呼び出し元のスレッドでの例外処理

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();
    }
}
ログイン後にコピー

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート