Mengendalikan AggregateExceptions Secara Tak Segerak dengan Penunggu Tersuai
Pendekatan standard untuk mengendalikan tugasan gagal yang mengandungi AggregateException
mengakibatkan hanya pengecualian pertama dilemparkan, manakala selebihnya hilang. Ini menimbulkan masalah yang ketara apabila butiran pengecualian komprehensif adalah penting untuk penyahpepijatan dan analisis ralat.
Cabaran:
Bagaimanakah kita boleh menangkap dan membuang semula AggregateException
yang lengkap dengan berkesan semasa operasi tak segerak, mengelakkan penyelesaian yang menyusahkan seperti blok try-catch
eksplisit atau panggilan Task.Wait()
terus?
Penyelesaian: Penunggu Tersuai
Mengubah suai secara langsung TaskAwaiter
terbina dalam adalah rumit. Penyelesaian yang lebih praktikal melibatkan mencipta penunggu tersuai untuk mengurus AggregateException
s dengan betul.
Diperbaiki WithAggregateException
Kaedah:
<code class="language-csharp">public static async Task WithAggregateException(this Task source) { try { await source.ConfigureAwait(false); } catch (Exception ex) { // Handle cancellation separately. if (source.IsCanceled) throw new TaskCanceledException(source); // Re-throw the original exception, preserving stack trace. ExceptionDispatchInfo.Capture(ex).Throw(); } }</code>
Kaedah sambungan ini meningkatkan kelas Task
. Ia memintas pengecualian semasa operasi menunggu, memastikan AggregateException
asal (atau pengecualian dalamannya jika jenis pengecualian lain), bersama-sama dengan surih tindanan lengkapnya, dibuang semula. Ini menyediakan mekanisme pengendalian ralat yang lebih bersih dan bermaklumat.
Atas ialah kandungan terperinci Bagaimana Kita Boleh Menunggu Pengecualian Agregat Tanpa Kehilangan Pengecualian Dalaman?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!