Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Mencegah Kehilangan Maklumat Ralat Semasa Mengendalikan AggregateExceptions dalam Kod C# Asynchronous?

Bagaimanakah Saya Boleh Mencegah Kehilangan Maklumat Ralat Semasa Mengendalikan AggregateExceptions dalam Kod C# Asynchronous?

Barbara Streisand
Barbara Streisandasal
2025-01-12 15:51:43326semak imbas

How Can I Prevent Losing Error Information When Handling AggregateExceptions in Asynchronous C# Code?

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!

Kenyataan:
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