使用「Fire and Forget」任務來擷取異常
在傳回任務的「Fire and Forget」方法的上下文中,一種常見的方法就是用擴展的方法悄悄地丟棄它們。然而,這種方法可能會隱藏任務執行過程中出現的意外異常。
考慮以下問題:將擴展方法定義為非同步方法是否更為謹慎,例如:
public static async void Forget(this Task task) { await task; }
透過這樣做,程式錯誤將觸發異常,提醒使用者潛在的問題。然而,這種方法背離了真正的「即發即忘」範例,其中完成和成功被忽略。
理解「即發即忘」的語意在這裡至關重要。真正的「即發即忘」方法意味著任務的結果無關緊要。儘管如此,在某些情況下,您可能希望處理特定的預期異常,而忽略其他異常。
處理預期異常
要解決此問題,可以將擴展方法修改為如下:
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; } }
使用此修改後的方法,您可以指定應靜默處理的可接受異常類型的清單處理。任何其他異常都會觸發異常,提醒您潛在的問題。
值得注意的是,建議使用await關鍵字而不是ContinueWith。這種選擇避免了潛在的調度問題,並使錯誤處理更加簡單。
以上是「即發即忘」任務是否應該非同步處理異常?的詳細內容。更多資訊請關注PHP中文網其他相關文章!