Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Mengekalkan Semua Butiran Pengecualian Semasa Menunggu Tugas dengan AggregateException?

Bagaimanakah Saya Boleh Mengekalkan Semua Butiran Pengecualian Semasa Menunggu Tugas dengan AggregateException?

Linda Hamilton
Lepaskan: 2025-01-12 16:11:43
asal
629 orang telah melayarinya

How Can I Preserve All Exception Details When Awaiting a Task with AggregateException?

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>
Salin selepas log masuk

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>
Salin selepas log masuk

Output:

<code>捕获所有异常:
异常 1
异常 2</code>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan