Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
21.1 Umum
Pengecualian dalam C# menyediakan cara terstruktur, seragam, dan jenis aman untuk menangani kondisi kesalahan tingkat sistem dan tingkat aplikasi.
21.2 Penyebab pengecualian
Pengecualian dapat dilemparkan dengan dua cara berbeda.
- Pernyataan
throw
(§13.10.6) segera melempar pengecualian dan tanpa syarat. Kontrol tidak pernah mencapai pernyataan segera setelahthrow
. - Kondisi luar biasa tertentu yang muncul selama pemrosesan pernyataan dan ekspresi C# menyebabkan pengecualian dilemparkan dalam keadaan tertentu ketika operasi tidak dapat diselesaikan secara normal. Lihat §21.5 untuk daftar berbagai pengecualian yang dapat dilemparkan dengan cara ini.
Contoh: Operasi pembagian bilangan bulat (§12.10.3) melempar
System.DivideByZeroException
jika denominator adalah nol. contoh akhir
21.3 Kelas System.Exception
Kelas System.Exception
adalah jenis dasar dari semua pengecualian. Kelas ini memiliki beberapa properti penting yang dibagikan semua pengecualian:
Message
adalah properti jenisstring
baca-saja yang berisi deskripsi yang dapat dibaca manusia tentang alasan pengecualian.InnerException
adalah properti baca-saja dari jenisException
. Jika nilainya non-null
, nilainya mengacu pada pengecualian yang menyebabkan pengecualian saat ini. (Artinya, pengecualian saat ini dimunculkan dalam blok tangkapan yang menanganiInnerException
.) Jika tidak, nilainya adalahnull
, menunjukkan bahwa pengecualian ini tidak disebabkan oleh pengecualian lain. Jumlah objek pengecualian yang dirantai bersama-sama dengan cara ini dapat segan-segan.
Nilai properti ini dapat ditentukan dalam panggilan ke konstruktor instans untuk System.Exception
.
21.4 Bagaimana pengecualian ditangani
Pengecualian ditangani oleh try
pernyataan (§13.11).
Ketika pengecualian dilemparkan (§21.2), sistem mencari klausul tangkapan terdekat yang dapat menangani pengecualian, seperti yang ditentukan oleh jenis run-time pengecualian. Pertama, metode saat ini dicari untuk pernyataan penutup try
leksikal, dan klausul terkait catch
dari try
pernyataan dipertimbangkan secara berurutan. Jika gagal, metode yang memanggil metode saat ini dicari untuk pernyataan penutup try
leksikal yang mencakup titik panggilan ke metode saat ini. Pencarian ini berlanjut hingga catch
klausul ditemukan yang dapat menangani pengecualian saat ini, dengan menamai kelas pengecualian yang berada di kelas yang sama, atau kelas dasar, dari jenis run-time pengecualian yang dilemparkan. catch
Klausa yang tidak memberi nama kelas pengecualian dapat menangani pengecualian apa pun.
Setelah klausul yang catch
cocok ditemukan, sistem bersiap untuk mentransfer kontrol ke pernyataan catch
pertama klausa. Sebelum eksekusi catch
klausul dimulai, sistem terlebih dahulu menjalankan, secara berurutan, klausa apa pun finally
yang terkait dengan try
pernyataan yang lebih bersarang daripada yang menangkap pengecualian.
Jika tidak ada klausa yang catch
cocok yang ditemukan:
- Jika pencarian klausa yang
catch
cocok mencapai konstruktor statis (§15.12) atau inisialisasi bidang statis, makaSystem.TypeInitializationException
dilemparkan pada titik yang memicu pemanggilan konstruktor statis. Pengecualian dalam berisiSystem.TypeInitializationException
pengecualian yang awalnya dilemparkan. - Jika tidak, jika pengecualian terjadi selama eksekusi finalizer, dan pengecualian tersebut tidak tertangkap, maka perilaku tersebut tidak ditentukan.
- Jika tidak, jika pencarian klausul yang
catch
cocok mencapai kode yang awalnya memulai utas, maka eksekusi utas dihentikan. Dampak penghentian tersebut ditentukan implementasi.
21.5 Kelas pengecualian umum
Pengecualian berikut dilemparkan oleh operasi C# tertentu.
Jenis Pengecualian | Keterangan |
---|---|
System.ArithmeticException |
Kelas dasar untuk pengecualian yang terjadi selama operasi aritmatika, seperti System.DivideByZeroException dan System.OverflowException . |
System.ArrayTypeMismatchException |
Dilemparkan ketika penyimpanan ke dalam array gagal karena jenis elemen yang disimpan tidak kompatibel dengan jenis array. |
System.DivideByZeroException |
Dilemparkan ketika upaya untuk membagi nilai integral dengan nol terjadi. |
System.IndexOutOfRangeException |
Dilemparkan ketika upaya untuk mengindeks array melalui indeks yang kurang dari nol atau di luar batas array. |
System.InvalidCastException |
Dilemparkan ketika konversi eksplisit dari jenis dasar atau antarmuka ke jenis turunan gagal pada run-time. |
System.NullReferenceException |
Dilemparkan saat null referensi digunakan dengan cara yang menyebabkan objek yang dirujuk diperlukan. |
System.OutOfMemoryException |
Dilemparkan ketika upaya untuk mengalokasikan memori (melalui new ) gagal. |
System.OverflowException |
Dibuat saat operasi aritmatika dalam konteks checked meluap. |
System.StackOverflowException |
Dilemparkan ketika tumpukan eksekusi habis dengan memiliki terlalu banyak panggilan yang tertunda; biasanya menunjukkan rekursi yang sangat dalam atau tidak terbatas. |
System.TypeInitializationException |
Dilemparkan ketika konstruktor statis atau penginisialisasi bidang statis melemparkan pengecualian, dan tidak ada catch klausa untuk menangkapnya. |
ECMA C# draft specification