Operasi tak segerak dan AggregateException: mengekalkan maklumat pengecualian
Apabila menunggu tugasan yang gagal, await
biasanya melemparkan semula pengecualian yang disimpan. Walau bagaimanapun, jika pengecualian yang disimpan ialah AggregateException
, ia hanya akan melemparkan semula pengecualian pertama.
Untuk mengatasi isu ini dan menangkap semua mesej ralat, pertimbangkan amalan terbaik berikut:
Gunakan kaedah sambungan
Anda boleh mencipta kaedah sambungan WithAggregateException
yang mengekalkan surih tindanan pengecualian asal jika ada:
<code class="language-csharp">public static async Task WithAggregateException(this Task source) { try { await source.ConfigureAwait(false); } catch { // 检查取消的任务。 if (source.Exception == null) throw; // 保留原始堆栈跟踪。 ExceptionDispatchInfo.Capture(source.Exception).Throw(); } }</code>
Dengan menggunakan kaedah sambungan ini, anda boleh menunggu tugasan dan mengendalikan AggregateException
sebagai entiti tunggal dengan butiran yang disimpan.
Contoh
Pertimbangkan contoh berikut:
<code class="language-csharp">// 创建一个具有多个异常的任务。 var task = Task.FromException(new AggregateException(new Exception("异常 1"), new Exception("异常 2"))); // 使用扩展方法等待任务。 try { await task.WithAggregateException(); } catch (AggregateException ex) { Console.WriteLine("捕获所有异常:"); foreach (var innerEx in ex.InnerExceptions) { Console.WriteLine(innerEx.Message); } }</code>
Output:
<code>捕获所有异常: 异常 1 异常 2</code>
Kaedah sambungan ini membolehkan anda menyimpan semua maklumat pengecualian semasa menunggu tugasan, memastikan butiran ralat tidak hilang secara tidak sengaja.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengekalkan Semua Butiran Pengecualian Semasa Menunggu Tugas dengan AggregateException?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!