Bagikan melalui


21 Pengecualian

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 setelah throw.
  • 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 jenis string baca-saja yang berisi deskripsi yang dapat dibaca manusia tentang alasan pengecualian.
  • InnerException adalah properti baca-saja dari jenis Exception. Jika nilainya non-null, nilainya mengacu pada pengecualian yang menyebabkan pengecualian saat ini. (Artinya, pengecualian saat ini dimunculkan dalam blok tangkapan yang menangani InnerException.) Jika tidak, nilainya adalah null, 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, maka System.TypeInitializationException dilemparkan pada titik yang memicu pemanggilan konstruktor statis. Pengecualian dalam berisi System.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.