保証された例外伝播を伴うファイア アンド フォーゲット
「ファイア アンド フォーゲット」アプローチでは、メソッドは完了または待機することなく呼び出されます。その結果を処理します。ただし、メソッドがタスクを返す場合、それは真の意味での「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 サイトの他の関連記事を参照してください。