ホームページ >バックエンド開発 >C++ >「起動して忘れる」非同期メソッドで例外を処理するにはどうすればよいですか?

「起動して忘れる」非同期メソッドで例外を処理するにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-29 05:34:14774ブラウズ

How Can I Handle Exceptions in a

保証された例外伝播を伴うファイア アンド フォーゲット

「ファイア アンド フォーゲット」アプローチでは、メソッドは完了または待機することなく呼び出されます。その結果を処理します。ただし、メソッドがタスクを返す場合、それは真の意味での「Fire and Forget」ではありません。タスク内でスローされた例外は、呼び出しコンテキストには伝播されません。

「Fire and Forget」メソッドの例外が確実に処理またはエスカレートされるようにするには、拡張メソッドを次のように変更することをお勧めします。

public static async void Forget(this Task task)
{
    await task;
}

タスクを待機することにより、タスク内でスローされた例外は呼び出し元のコンテキストに伝播され、処理またはエスカレーションされます。

「Fire and Forget」メソッドで予期される例外を処理する

元の質問は、「Fire and Forget」メソッドで予期される無視可能な例外をスローする可能性があるメソッドに関する懸念を引き起こしています。コンテキストは忘れてください。これに対処するには、拡張メソッドを変更して、受け入れ可能な例外タイプのリストを受け入れることができます。

public static async void Forget(this Task task, params Type[] acceptableExceptions)
{
    try
    {
        await task.ConfigureAwait(false);
    }
    catch (Exception ex)
    {
        // TODO: consider whether derived types are also acceptable.
        if (!acceptableExceptions.Contains(ex.GetType()))
            throw;
    }
}

これにより、呼び出し元はどの例外タイプを無視し、どの例外タイプをエスカレートするかを指定できるようになり、より詳細な制御が可能になります。 「Fire and Forget」メソッドの例外処理動作。

以上が「起動して忘れる」非同期メソッドで例外を処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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