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.
22.1 Umum
Pengecualian dalam C# menyediakan cara terstruktur, seragam, dan jenis aman untuk menangani kondisi kesalahan tingkat sistem dan tingkat aplikasi.
22.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 §22.5 untuk daftar berbagai pengecualian yang dapat dilemparkan dengan cara ini.
Contoh: Operasi pembagian bilangan bulat (§12.12.3) melempar
System.DivideByZeroExceptionjika denominator adalah nol. contoh akhir
22.3 Kelas System.Exception
Kelas System.Exception adalah jenis dasar dari semua pengecualian. Kelas ini memiliki beberapa properti penting yang dibagikan semua pengecualian:
-
Messageadalah properti jenisstringbaca-saja yang berisi deskripsi yang dapat dibaca manusia tentang alasan pengecualian. -
InnerExceptionadalah 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.
22.4 Bagaimana pengecualian ditangani
Pengecualian ditangani oleh try pernyataan (§13.11).
Ketika pengecualian dilemparkan (§22.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
catchcocok mencapai konstruktor statis (§15.12) atau inisialisasi bidang statis, makaSystem.TypeInitializationExceptiondilemparkan pada titik yang memicu pemanggilan konstruktor statis. Pengecualian dalam berisiSystem.TypeInitializationExceptionpengecualian 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
catchcocok mencapai kode yang awalnya memulai utas, maka eksekusi utas dihentikan. Dampak penghentian tersebut ditentukan implementasi.
22.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.InvalidOperationException |
Dilemparkan ketika panggilan metode tidak valid untuk status objek saat ini. |
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