Menangkap Pengecualian dengan Tugasan "Fire and Forget"
Dalam konteks kaedah "Fire and Forget" yang mengembalikan tugasan, pendekatan biasa adalah menggunakan kaedah sambungan untuk membuangnya secara senyap. Walau bagaimanapun, pendekatan ini mungkin menyembunyikan pengecualian yang tidak dijangka dalam pelaksanaan tugas.
Pertimbangkan soalan berikut: adakah lebih bijak untuk mentakrifkan kaedah sambungan sebagai kaedah tak segerak, seperti:
public static async void Forget(this Task task) { await task; }
Dengan berbuat demikian, ralat pengaturcaraan akan mencetuskan pengecualian, memberi amaran kepada pengguna tentang isu yang berpotensi. Walau bagaimanapun, pendekatan ini bertolak daripada paradigma "api dan lupa" yang sebenar, di mana penyempurnaan dan kejayaan diabaikan.
Memahami semantik "api dan lupa" adalah penting di sini. Pendekatan "api dan lupa" yang tulen membayangkan bahawa hasil daripada tugas itu tidak penting. Namun begitu, mungkin terdapat senario di mana anda ingin mengendalikan pengecualian jangkaan khusus sambil mengabaikan yang lain.
Mengendalikan Pengecualian Jangkaan
Untuk menangani perkara ini, kaedah sambungan boleh diubah suai sebagai berikut:
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; } }
Dengan kaedah yang disemak ini, anda boleh menentukan senarai jenis pengecualian yang boleh diterima yang harus dikendalikan secara senyap. Sebarang pengecualian lain akan mencetuskan pengecualian, memaklumkan anda tentang kemungkinan masalah.
Perlu diambil perhatian bahawa menggunakan kata kunci tunggu adalah disyorkan dan bukannya Teruskan Dengan. Pilihan ini mengelakkan kemungkinan isu penjadualan dan menjadikan pengendalian ralat lebih mudah.
Atas ialah kandungan terperinci Patutkah Tugasan 'Membakar dan Melupakan' Mengendalikan Pengecualian Secara Asynchronous?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!