Memelihara Butiran Pengecualian Semasa Menunggu Tugasan Bersalah dengan AggregateExceptions
Pengaturcaraan tak segerak selalunya melibatkan tugasan menunggu. Walau bagaimanapun, apabila tugasan gagal dan mengandungi AggregateException
, operator await
standard hanya melemparkan semula pengecualian pertama, yang berpotensi kehilangan maklumat diagnostik penting. Artikel ini memperincikan penyelesaian yang mantap untuk mengendalikan dan mengekalkan semua pengecualian dengan tepat dalam AggregateException
.
Cabarannya terletak pada mengekalkan AggregateException
asal sambil masih menggunakan kemudahan await
. Walaupun blok try-catch
mungkin kelihatan mencukupi, penyelesaian yang lebih elegan dan bermaklumat adalah lebih baik. Membuat penunggu tersuai adalah mungkin, tetapi menambah kerumitan yang tidak perlu.
Pertimbangkan contoh ini yang menunjukkan masalah:
static async Task Run() { Task[] tasks = new[] { CreateTask("ex1"), CreateTask("ex2") }; await Task.WhenAll(tasks); } static Task CreateTask(string message) { return Task.Factory.StartNew(() => { throw new Exception(message); }); }
Dalam Run
, hanya satu pengecualian dibatalkan semula, walaupun dua pengecualian berlaku dalam tugasan asas.
Penyelesaian menggunakan kaedah sambungan:
public static async Task HandleAggregateExceptions(this Task source) { try { await source.ConfigureAwait(false); } catch (Exception ex) { // Check for null Exception in case of cancellation if (source.Exception == null) throw; // ExceptionDispatchInfo preserves the original exception's stack trace. ExceptionDispatchInfo.Capture(source.Exception).Throw(); } }
Kaedah sambungan HandleAggregateExceptions
ini memastikan semua pengecualian dalam AggregateException
dilemparkan semula dengan betul, mengekalkan surih tindanan asalnya. Ini memudahkan pengendalian ralat yang menyeluruh dan memudahkan penyahpepijatan. Menggunakan kaedah ini, panggilan await tasks.HandleAggregateExceptions();
akan memberikan butiran pengecualian lengkap.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menunggu Tugas dengan Tepat dan Mengendalikan AggregateExceptions Tanpa Kehilangan Butiran Pengecualian?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!