Yanıtlar:
Halihazırda yürütülen yöntemin, kaynakların uygun şekilde temizlenmesine izin verirken yine de istisna atmasını istiyorsanız bu yararlıdır. Aşağıda, bir arama yönteminden gelen istisnayı ele almanın somut bir örneği verilmiştir.
public void yourOtherMethod() {
try {
yourMethod();
} catch (YourException ex) {
// handle exception
}
}
public void yourMethod() throws YourException {
try {
db.store(mydata);
} finally {
db.cleanup();
}
}
catch
blok olmadığında , atılan finally
istisna, try
bloktaki herhangi bir istisnadan önce yürütülür . Yani iki istisna bir varsa try
ve bir finally
birdir atılacaktır tek istisna finally
. Bu davranış PHP ve Python'da aynı değildir, çünkü her iki istisna da bu dillerde aynı anda fırlatılır ve istisna sırası try
önce bir sonra olur finally
.
Orada çünkü programcı db.cleanup()
, try bloğunun içindeki kod bir istisna atsa bile bunun çağrıldığından emin olmak istedi . Herhangi bir istisna bu blok tarafından ele alınmayacaktır, ancak bunlar yalnızca son blok yürütüldükten sonra yukarı doğru yayılacaktır.
try
İzin vermek sadece orada finally
. İstisnalar yakalanmaz.
Bu kod neden bu şekilde yapıyor?
Çünkü görünüşe göre kod bu seviyedeki istisnaları nasıl ele alacağını bilmiyor. Sorun değil - arayanlardan biri yaptığı sürece, yani istisna sonuçta bir yerde ele alındığı sürece.
Çoğu zaman, düşük seviyeli kod istisnalara uygun şekilde tepki veremez çünkü kullanıcının bilgilendirilmesi gerekir veya istisnanın günlüğe kaydedilmesi gerekir veya başka bir stratejinin denenmesi gerekir. Düşük seviyeli kod yalnızca bir işlevi yerine getirir ve üst düzey karar verme hakkında bilgi sahibi değildir.
Ancak kodun yine de kaynaklarını temizlemesi gerekir (çünkü yapmazsa, sızarlar), bu yüzden finally
cümlecikte tam da bunu yapar , bir istisna atılsa da atılmasa da her zaman gerçekleşmesini sağlar.
Nihai blok, bir RuntimeException oluştuğunda (belki de çağrılan koddaki bazı hatalardan dolayı) db.cleanup()
çağrının yapılmasını sağlar.
Bu aynı zamanda çok fazla iç içe geçmeyi önlemek için de kullanılır:
try
{
if (foo) return false;
//bla ...
return true;
}
finally
{
//clean up
}
Özellikle yöntemin geri döndüğü birçok nokta olduğunda, bu okunabilirliği artırır, çünkü herkes her durumda temizleme kodunun çağrıldığını görebilir.
Kod, veritabanının kapatıldığından emin olmak için yapıyor.
Genellikle, bunu yapmanın yolu, tüm veritabanınızı erişim kodunu try bloğuna koymak ve ardından veritabanını kapatmak için bir çağrı yapmaktır.
Try ... nihayet çalışma şekli, try bloğundaki kodun çalıştırıldığı ve final bloğundaki kodun ne olursa olsun bittiğinde çalıştırıldığı anlamına gelir.
Bilgisayarın duvardan çekilmesinden kısa süre sonra, sonunda çalıştırılacaktır.
Bu, bir istisna çağrılsa ve yöntemin yürütülmesi üç yıl sürse bile, yine de nihayet bloğuna gireceği ve veritabanının kapatılacağı anlamına gelir.
fopen
veya DB bağlantısı için (ayrıca PHP'de) belirtilen diğer yanıtlar gibi temizlemeyi sağlar