Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Mengekalkan Jejak Tindanan Apabila Melemparkan Semula Pengecualian dalam C#?

Bagaimanakah Saya Boleh Mengekalkan Jejak Tindanan Apabila Melemparkan Semula Pengecualian dalam C#?

DDD
DDDasal
2025-01-17 07:06:09180semak imbas

How Can I Preserve Stack Traces When Rethrowing Exceptions in C#?

Memelihara jejak tindanan apabila melontar semula pengecualian dalam dalam C#

Walaupun menjadi amalan biasa untuk membuang semula InnerException untuk memberikan pengecualian asas kepada pemanggil, ini boleh memadamkan maklumat surih tindanan yang berharga secara tidak sengaja, menghalang usaha penyahpepijatan.

Dalam C#, apabila kaedah dipanggil melalui refleksi dan pengecualian berlaku, TargetInvocationException dilemparkan sebagai pembalut di sekeliling pengecualian sebenar. Untuk mendapatkan pengecualian dalaman, pembangun selalunya membuangnya semula. Walau bagaimanapun, operasi ini akan memadamkan maklumat surih tindanan yang menunjuk kepada sumber sebenar ralat.

Penyelesaian menggunakan ExceptionDispatchInfo

Sejak .NET 4.5, kelas ExceptionDispatchInfo menyediakan penyelesaian kepada masalah ini. Ia membenarkan menangkap pengecualian dan melemparkannya semula sambil mengekalkan surih tindanannya. Begini cara menggunakannya:

<code class="language-csharp">using ExceptionDispatchInfo = 
    System.Runtime.ExceptionServices.ExceptionDispatchInfo;

try
{
    // 执行可能抛出异常的方法。
    task.Wait();
}
catch (AggregateException ex)
{
    // 捕获内部异常并使用原始堆栈跟踪重新抛出它。
    ExceptionDispatchInfo.Capture(ex.InnerException).Throw();
}</code>

Kaedah ini amat berguna apabila membuka pengecualian dalaman daripada contoh AggregateException selepas menggunakan ciri bahasa C# menunggu. Ia memastikan bahawa maklumat surih tindanan tidak hilang semasa pengaturcaraan tak segerak.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengekalkan Jejak Tindanan Apabila Melemparkan Semula Pengecualian dalam C#?. 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