Asynchronous C# dan Cabaran AggregateExceptions
Apabila bekerja dengan operasi tak segerak dalam C# menggunakan await
, mengurus pengecualian daripada tugas yang rosak memerlukan perhatian yang teliti. Walaupun await
lazimnya melemparkan semula pengecualian pertama yang ditemui dalam AggregateException
, malangnya pengecualian berikutnya hilang. Peninggalan ini boleh menyebabkan pelaporan ralat tidak lengkap dan menghalang usaha penyahpepijatan.
Penyelesaian: Mengekalkan Butiran Pengecualian
Untuk mengekalkan semua butiran pengecualian yang terkandung dalam AggregateException
dengan berkesan, kaedah sambungan tersuai menawarkan penyelesaian yang mantap:
<code class="language-csharp">public static async Task WithAggregateExceptionHandling(this Task source) { try { await source.ConfigureAwait(false); } catch (Exception ex) { // Preserve original exception context ExceptionDispatchInfo.Capture(source.Exception ?? new Exception("Task was cancelled or encountered an unknown error.")).Throw(); } }</code>
Kaedah sambungan ini merangkumi panggilan await
dalam blok try-catch
. Yang penting, ia menggunakan ExceptionDispatchInfo.Capture
untuk membuang semula pengecualian asal (atau pengecualian lalai jika tugas itu dibatalkan), memastikan konteks pengecualian lengkap—termasuk surih tindanan—dikekalkan.
Contoh Pelaksanaan
Menyepadukan kaedah ini adalah mudah:
<code class="language-csharp">Task[] tasks = new[] { /* ... your tasks ... */ }; await Task.WhenAll(tasks).WithAggregateExceptionHandling(); // Rethrows AggregateException with full context</code>
Dengan menggunakan pendekatan ini, pembangun boleh mengendalikan AggregateExceptions
dengan berkesan dalam kod C# tak segerak, menghalang kehilangan maklumat ralat yang berharga dan memudahkan pengendalian dan penyahpepijatan ralat yang lebih teliti.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencegah Kehilangan Maklumat Ralat Semasa Mengendalikan AggregateExceptions dalam Kod C# Asynchronous?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!