![]() Önceki |
![]() İçindekiler |
![]() 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 |
![]() Önceki |
![]() İçindekiler |
![]() Sonraki |