Rumah >pembangunan bahagian belakang >C++ >`throw` vs. `throw new Exception()`: Bilakah Anda Perlu Melemparkan Semula Pengecualian dalam C#?

`throw` vs. `throw new Exception()`: Bilakah Anda Perlu Melemparkan Semula Pengecualian dalam C#?

Susan Sarandon
Susan Sarandonasal
2025-01-13 12:20:53341semak imbas

`throw` vs. `throw new Exception()`: When Should You Rethrow Exceptions in C#?

Pengendalian pengecualian C#: Perbezaan antara throw dan throw new Exception()

Apabila mengendalikan pengecualian C#, pengaturcara mungkin menghadapi dua struktur yang kelihatan serupa:

<code class="language-csharp">try { ... }
catch { throw }</code>

dan

<code class="language-csharp">try { ... }
catch (Exception e) { throw new Exception(e.Message); }</code>

Walaupun kedua-duanya membuang pengecualian, terdapat perbezaan utama dalam tingkah laku mereka.

throw

Pernyataan throw tanpa parameter melemparkan semula pengecualian asal yang menyebabkan blok try gagal. Ini bermakna surih tindanan pengecualian asal dikekalkan, menjadikannya lebih mudah untuk nyahpepijat dan mengesan punca ralat.

throw new Exception()

Sebaliknya, throw new Exception(e.Message) mencipta contoh pengecualian baharu dengan atribut Messagenya ditetapkan kepada mesej pengecualian asal. Walau bagaimanapun, ini mempunyai beberapa kelemahan:

  • Surih tindanan hilang: Surih tindanan untuk pengecualian baharu ditetapkan semula, memusnahkan sebarang maklumat pengesanan daripada sumber pengecualian asal.
  • Maklumat jenis hilang: Pengecualian baharu telah kehilangan jenis pengecualian asal, menjadikannya sukar untuk menentukan sifatnya yang tepat.
  • Maklumat tambahan yang hilang: Beberapa pengecualian, seperti ArgumentException, mengandungi maklumat tambahan (seperti ParamName) yang hilang apabila mencipta pengecualian baharu daripada jenis yang berbeza.

Amalan Terbaik:

Dalam kebanyakan kes, sangat disyorkan untuk mengelak daripada menggunakan throw e atau throw new Exception(e.Message) untuk membuang semula pengecualian. Pertimbangkan perkara berikut:

  • Kekalkan surih tindanan asal: Untuk membuang semula pengecualian asal dan mengekalkan surih tindanannya, gunakan throw;.
  • Pengecualian yang dibalut: Dalam sesetengah kes, semua pengecualian mungkin diperlukan untuk membalut objek pengecualian tersuai untuk memberikan maklumat tambahan. Walau bagaimanapun, sentiasa pastikan pengecualian tersuai anda mempunyai keempat-empat pembina pengecualian dan mengekalkan sifat pengecualian asal, termasuk surih tindanan, dengan menghantarnya sebagai argumen InnerException.

Atas ialah kandungan terperinci `throw` vs. `throw new Exception()`: Bilakah Anda Perlu 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