Cara menjalankan kode pembersihan menggunakan finally
Tujuan dari pernyataan finally
adalah untuk memastikan bahwa pembersihan objek yang diperlukan, biasanya objek yang memegang sumber daya eksternal, segera dilakukan, bahkan jika pengecualian dilemparkan. Salah satu contoh pembersihan tersebut adalah memanggil Close pada FileStream segera setelah digunakan alih-alih menunggu objek menjadi sampah yang dikumpulkan oleh runtime bahasa umum, seperti berikut ini:
static void CodeWithoutCleanup()
{
FileStream? file = null;
FileInfo fileInfo = new FileInfo("./file.txt");
file = fileInfo.OpenWrite();
file.WriteByte(0xF);
file.Close();
}
Contoh
Untuk mengubah kode sebelumnya menjadi pernyataan try-catch-finally
, kode pembersihan dipisahkan dari kode kerja, seperti berikut ini.
static void CodeWithCleanup()
{
FileStream? file = null;
FileInfo? fileInfo = null;
try
{
fileInfo = new FileInfo("./file.txt");
file = fileInfo.OpenWrite();
file.WriteByte(0xF);
}
catch (UnauthorizedAccessException e)
{
Console.WriteLine(e.Message);
}
finally
{
file?.Close();
}
}
Karena pengecualian dapat terjadi kapan saja dalam blok try
sebelum panggilan OpenWrite()
, atau panggilan OpenWrite()
itu sendiri bisa saja gagal, kami tidak menjamin bahwa file terbuka ketika kami mencoba menutupnya. Blok finally
menambahkan pemeriksaan untuk memastikan bahwa objek FileStream bukanlah null
sebelum Anda memanggil metode Close. Tanpa pemeriksaan null
, blok finally
dapat melempar NullReferenceException-nya sendiri, tetapi melemparkan pengecualian dalam blok finally
harus dihindari jika memungkinkan.
Koneksi database adalah kandidat lain yang baik untuk ditutup dalam blok finally
. Karena jumlah koneksi yang diizinkan ke server database terkadang terbatas, Anda harus menutup koneksi database sesegera mungkin. Jika pengecualian dilemparkan sebelum Anda dapat menutup koneksi Anda, menggunakan blok finally
lebih baik daripada menunggu pengumpulan sampah.