Masalah dalam mengendalikan AggregateException dalam pengaturcaraan tak segerak
Dalam dunia pengaturcaraan tak segerak, kata kunci await
menyediakan cara yang elegan untuk menjeda pelaksanaan sehingga tugasan selesai. Walau bagaimanapun, await
memperkenalkan masalah halus apabila mengendalikan tugas yang salah: ia melemparkan semula pengecualian pertama dalam AggregateException
, yang berpotensi kehilangan maklumat ralat yang berharga.
Untuk menyelesaikan masalah ini, pembangun berhadapan dengan masalah yang sukar. Mereka mungkin menggunakan penyelesaian yang tidak elok, atau cuba menggunakan awaiter
tersuai. Walau bagaimanapun, amalan terbaik untuk mengendalikan await
secara bersih dalam AggregateException
masih sukar difahami.
Jawapan kepada soalan
Bertentangan dengan cadangan dalam tajuk, tingkah laku lalai await
selalunya bermanfaat dalam situasi ini. Dalam kebanyakan kes, hanya mengetahui tentang pengecualian sudah cukup. Cabaran sebenar adalah untuk mengendalikan AggregateException
dengan cara yang membolehkan pengendalian pengecualian terpilih.
Untuk mencapai matlamat ini, kaedah sambungan berikut menyediakan penyelesaian yang kemas:
<code class="language-csharp">public static async Task WithAggregateException(this Task source) { try { await source.ConfigureAwait(false); } catch (Exception ex) { // source.Exception 可能为 null,如果任务被取消。 if (source.Exception == null) throw ex; // 抛出原始异常,例如取消异常 // EDI 保留原始异常的堆栈跟踪,如果有的话。 ExceptionDispatchInfo.Capture(source.Exception).Throw(); } }</code>
Dengan merangkum operasi await
dalam blok try-catch
, kaedah ini membenarkan pembangun mengakses AggregateException
dan membuangnya semula menggunakan ExceptionDispatchInfo.Capture
. Ini mengekalkan surih tindanan pengecualian asal, membolehkan pembangun mengendalikan ralat dengan sewajarnya. Kod yang diubah suai mengendalikan kes pembatalan tugas dengan lebih lengkap.
Atas ialah kandungan terperinci Bagaimana Saya Boleh Mengendalikan AggregateExceptions Dengan Terbaik Apabila Menggunakan `menunggu`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!