Sınıf sabitleri
Önceki
İçindekiler
İçindekiler
İstisna işlemleri: ensure
Sonraki

 Ruby Kullanıcı Kılavuzuİstisna işlemleri: rescue 

Çalıştırılan bir program beklenmeyen sorunlar doğurabilir. Okunmaya çalışılan bir dosya mevcut olmayabilir ya da veri kaydetmemek istediğimiz disk dolu olabilir.

ruby> dosya = open("bir_dosya")
ERR: (eval):1:in `open': No such dosya or directory - bir_dosya

Güçlü bir program bu gibi durumları hassasiyetle yakalayacaktır. C programcılarından, hata doğurabilecek her sistem çağrısının sonucunu kontrol etmeleri ve anında ne yapılacağına ilişkib karar vermeleri beklenir:

FILE *dosya = fopen("bir_dosya", "r");
if (dosya == NULL) {
  fprintf( stderr, "Dosya bulunamadi.\n" );
  exit(1);
}
okunan_bytelar = fread( buf, 1, istenen_bytelar, dosya );
if (okunan_bytelar != istenen_bytelar ) {
  /* daha fazla hata yakalaması yap ... */
}
...

Bu programcıları dikkatsizliğe ve ihmalciliğe iten, üstelik hataları tam olarak yakalayamayan bir program yazmanıza yol açan sıkıcı bir uygulamadır. Öte yandan, işi doğru düzgün yapmak, yakalanabilecek bir çok hata olduğu için programın okunabilirliğini oldukça zorlaştıracaktır.

Bir çok modern dilde olduğu gibi Ruby'de de, programcıyı ya da sonradan kodumuzu okuyan kişileri sıkıntıya sokmadan, sürprizleri bloklarca koddan bölümlenmiş bir yolla yakalayabiliriz. begin ile işaretlenmiş kod bloğu bir istisnayla karşılaşana dek çalıştırılır, hata durumunda kontrolü rescue ile işaretlenmiş kod bloğuna verir. Eğer hiçbir istisnayla karşılaşılmazsa rescue kodu kullanılmaz. Aşağıdaki metot bir text dosyasının ilk satırını döndürür, bir istisna ile karşılaşırsa da nil değerini döndürür:

def ilk_satir( dosyaname )
  begin
    dosya = open("bir_dosya")
    info = dosya.gets
    dosya.close
    info  # Son değerlendirilen şey return değeri
  rescue
    nil   # Dosyayı okuyamadı mı? o halde bir dizgi döndürme
  end
end

Bir problemle yaratıcı bir biçimde ilgilenmek istediğimiz zamanlar olacaktır. Örneğin dosyaya erişmek mümkün değilse standart girdi yerine başka bir şey kullanmak isteyebiliriz:

begin
  dosya = open("bir_dosya")
rescue
  dosya = STDIN
end

begin
  # ... girdiyi işlet ...
rescue
  # ... ve burada diğer istisnalarla ilgilen.
end

begin kodunu tekrar çalıştırmak için rescue'nun içinde retry'ı kullanabiliriz. Bu bize önceki örneğimizi daha kısa şekilde yazmamıza izin verir:

fname = "bir_dosya"
begin
  dosya = open(fname)
  # ... girdiyi işlet ...
rescue
  fname = "STDIN"
  retry
end

Ancak burada bir kusur bulunmaktadır. Hiç olmayan bir dosya bu kodun sonsuz bir döngüde kendisini tekrar etmesini sağlayacaktır. retry'ı kullanırken bu tür durumlara dikkat etmelisiniz.

Her Ruby kütüphanesi, sizin de kendi kodunuzda yapabileceğiniz gibi, herhangi bir hata karşısında bir istisna (exception) doğurur. Bir istisnayı çıkarmak için raise kullanılır. raise tek argüman olarak istisnayı açıklayan bir dizgi alır. Bu argüman seçeneğe bağlıdır ancak atlanmaması gereken bir husustur. Özel değişkenlerden olan $! ile sonradan ulaşılabilir.

ruby> raise "test error"
   test error
ruby> begin
    |   raise "test2"
    | rescue
    |   print "Bir hata oluştu: ",$!, "\n"
    | end
Bir hata oluştu: test2
   nil


Sınıf sabitleri
Önceki
İçindekiler
İçindekiler
İstisna işlemleri: ensure
Sonraki