Marhabalar,
Daha Önceki yazımızda belirttiğimiz hata yakalama sizlere yetmemiş olabilir. Bazı durumlarda tüm bu hata yakalama işlemlerinden daha sert bir şeye ihtiyacınız olabilir. İşte bu yazının yazılma nedeni bu :)
Bir Önceki yazımızda, diğer dillerde yer alan try..catch..finally kavramını tamamen destekleyen hatta fazlasını veren begin..rescue..else..ensure kavramı ile tanışmıştık. Daha fazla bilgi için.
Bu yazımızda daha Önceden de belirttiğimiz gibi daha sert bir kavramı inceleyeceğiz.
catch..throw
Hemen Örneğimizi verelim;
[ruby]
$stdout.sync = true
catch (:hata_test) do
begin
field = gets.chomp
throw :hata_test if field.index(“hata”) == 0
puts “Hata bulunamadı..”
end while 1 == 1
puts “Bu bÖlüm hiç işlenmeyecek.”
end
puts “Hata üretilmeden ‘catch’ bloğundan çıkıldı..”
[/ruby]
Ruby programınızı çalıştırırken, throw deyimine rastladığında, en yakın uyumlu* catch‘e kadar yukarı çıkar. Ve catch bloğunun işlenmesini sona erdirerek, bu bloktan sonraki kodları işlemeye başlar.
*throw deyimine parametre olarak bir deyim veya String verilebilir. Eğer bu parametre verilir ise, bu parametreye uygun olan catch yakalanmaya çalışır.
Eğer throw deyimi nedeni ile yukarıya doğru giderken herhangi bir catch bulunamaz ise, `in throw’: uncaught throw `hata_adı’ (NameError) şekilde bir hata ile programımız sonlanır.
GÖrüldüğü gibi, begin..rescue..else..ensure deyimi gibi, catch..throw deyimini çeşitlendirmek pek kolay bir yÖntem değil. Bu nedenle çok zorda kalmadığınızda kullanmayın. Ama sert ve keskin bir biçimde programın işlenmesini kesmek ve/veya yÖnünü değiştirmek istediğiniz kullanabilirsiniz.