25. Hata İşleme: ensure
deyimi
Bazen bir yöntem işini bitirdikten sonra temizlik yapılması gerekebilir. Örneğin açılmış olan bir dosyanın kapatılması ya da bir veri için ayrılan bellek gözesinin boşaltılması gerekebilir. Eğer her yöntem için her zaman tek bir çıkış noktası olsaydı temizleme kodumuzu tek bir yere koyardık ve çalıştırılacağından emin olurduk. Ancak yöntem bir çok yere geri dönebilir ve temizlik kodumuz beklenmeyen istisnalardan dolayı atlanabilir.
begin file = open("/tmp/bir_dosya", "w") # ... dosyaya yaziliyor... file.close end
Ayrıca eğer kodun dosyaya yazdığımız kısmında bir istisna meydana gelirse o zaman dosya açık bırakılabilir. Ve böyle bir fazlalığa gitmek istemeyiz:
begin file = open("/tmp/bir_dosya", "w") # ... dosyaya yazılıyor ... file.close rescue file.close fail # istisna yakalanıyor end
Bu hantal bir yöntemdir; her return ve break ile ilgilenmek zorunda kalınca işler çığrından çıkar.
Bu yüzden "begin...rescue...end" şemasına ensure adında başka bir anahtar kelime daha ekleriz. ensure kodu begin kodunun başarılı olup olmadığına bakmaksızın çalıştırılır.
begin file = open("/tmp/bir_dosya", "w") # ... dosyaya yazılıyor ... rescue # ... istisnalar yakalanıyor... ensure file.close # ...her zaman yapılması gerekir end
ensure kodunu rescue olmadan da kullanmak mümkündür ya da tam tersi; ancak aynı begin...end bloğunda birlikte kullanılıyorlarsa rescue, ensure'den önce gelmelidir.