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.
Dalam C#, kesalahan dalam program pada run time disebarluaskan melalui program dengan menggunakan mekanisme yang disebut pengecualian. Pengecualian dihasilkan oleh kode yang mengalami kesalahan dan ditangkap oleh kode yang dapat memperbaiki kesalahan. Pengecualian dapat dihasilkan oleh runtime .NET atau dengan kode dalam program. Setelah pengecualian dilemparkan, tumpukan panggilan diteruskan ke atas hingga pernyataan catch untuk pengecualian ditemukan. Pengecualian yang tidak tertangkap ditangani oleh handler pengecualian generik yang disediakan oleh sistem yang menampilkan kotak dialog.
Pengecualian diwakili oleh kelas yang berasal dari Exception. Kelas ini mengidentifikasi jenis pengecualian dan berisi properti yang memiliki detail tentang pengecualian. Melemparkan pengecualian melibatkan pembuatan instans kelas turunan pengecualian, secara opsional mengonfigurasi properti pengecualian, lalu melemparkan objek dengan menggunakan throw kata kunci. Contohnya:
class CustomException : Exception
{
public CustomException(string message)
{
}
}
private static void TestThrow()
{
throw new CustomException("Custom exception in TestThrow()");
}
Setelah pengecualian dilemparkan, runtime memeriksa pernyataan saat ini untuk melihat apakah itu berada dalam try blok. Jika ya, setiap blok catch yang terkait dengan blok try diperiksa untuk melihat apakah mereka dapat menangkap pengecualian.
Catch blok biasanya menentukan jenis pengecualian; jika jenis catch blok adalah jenis yang sama dengan pengecualian, atau kelas dasar pengecualian, catch blok dapat menangani metode . Contohnya:
try
{
TestThrow();
}
catch (CustomException ex)
{
System.Console.WriteLine(ex.ToString());
}
Jika pernyataan yang melemparkan pengecualian tidak berada dalam try blok atau jika try blok yang mengapitnya tidak memiliki blok catch yang cocok, runtime memeriksa metode panggilan untuk try pernyataan dan catch blok. Runtime melanjutkan tumpukan panggilan, mencari blok yang kompatibel catch .
catch Setelah blok ditemukan dan dijalankan, kontrol diteruskan ke pernyataan berikutnya setelah blok tersebutcatch.
Pernyataan try dapat berisi lebih dari satu catch blok. Pernyataan pertama catch yang dapat menangani pengecualian dijalankan; pernyataan berikut catch , meskipun kompatibel, diabaikan. Urutkan blok tangkap dari yang paling spesifik (atau paling khusus) hingga yang paling tidak spesifik. Contohnya:
using System;
using System.IO;
namespace Exceptions
{
public class CatchOrder
{
public static void Main()
{
try
{
using (var sw = new StreamWriter("./test.txt"))
{
sw.WriteLine("Hello");
}
}
// Put the more specific exceptions first.
catch (DirectoryNotFoundException ex)
{
Console.WriteLine(ex);
}
catch (FileNotFoundException ex)
{
Console.WriteLine(ex);
}
// Put the least specific exception last.
catch (IOException ex)
{
Console.WriteLine(ex);
}
Console.WriteLine("Done");
}
}
}
Sebelum blok catch dijalankan, runtime memeriksa blok finally.
Finally blok memungkinkan programmer untuk membersihkan status ambigu yang mungkin tertinggal dari blok try yang dibatalkan, atau untuk melepaskan sumber daya eksternal seperti handle grafis, koneksi database, atau aliran file tanpa harus menunggu pengumpul sampah di runtime untuk menyelesaikan objek. Contohnya:
static void TestFinally()
{
FileStream? file = null;
//Change the path to something that works on your machine.
FileInfo fileInfo = new System.IO.FileInfo("./file.txt");
try
{
file = fileInfo.OpenWrite();
file.WriteByte(0xF);
}
finally
{
// Closing the file allows you to reopen it immediately - otherwise IOException is thrown.
file?.Close();
}
try
{
file = fileInfo.OpenWrite();
Console.WriteLine("OpenWrite() succeeded");
}
catch (IOException)
{
Console.WriteLine("OpenWrite() failed");
}
}
Jika WriteByte() melemparkan pengecualian, kode di blok kedua try yang mencoba membuka kembali file akan gagal jika file.Close() tidak dipanggil, dan file akan tetap terkunci. Karena finally blok dijalankan bahkan jika pengecualian dilemparkan, finally blok dalam contoh sebelumnya memungkinkan file ditutup dengan benar dan membantu menghindari kesalahan.
Jika tidak ada blok yang kompatibel catch yang ditemukan pada tumpukan panggilan setelah pengecualian dilemparkan, salah satu dari tiga hal terjadi:
- Jika pengecualian terjadi di dalam finalizer, finalizer dibatalkan dan finalizer dasar, jika ada, dipanggil.
- Jika tumpukan panggilan berisi konstruktor statis atau penginisialisasi bidang statis, maka TypeInitializationException akan dilemparkan, dengan pengecualian asli yang ditetapkan ke properti InnerException dari pengecualian baru.
- Jika awal utas tercapai, utas akan berakhir.