Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Menunggu Tugas dengan Tepat dan Mengendalikan AggregateExceptions Tanpa Kehilangan Butiran Pengecualian?

Bagaimanakah Saya Boleh Menunggu Tugas dengan Tepat dan Mengendalikan AggregateExceptions Tanpa Kehilangan Butiran Pengecualian?

DDD
Lepaskan: 2025-01-12 15:55:43
asal
1003 orang telah melayarinya

How Can I Accurately Await Tasks and Handle AggregateExceptions Without Losing Exception Details?

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

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();
    }
}
Salin selepas log masuk

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!

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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan