Ruby istisnaları begin/rescue/ ile işler (Ruby'nin try/catch/finally eşdeğeri). İstisnaları ile oluşturur ve ile yakalar, temizlik için kullanırsınız. Ruby ayrıca daha temiz kod için metod düzeyinde rescue'ye izin verir (açık olmadan).
Ruby istisnaları begin/rescue/ ile işler (Ruby'nin try/catch/finally eşdeğeri). İstisnaları ile oluşturur ve ile yakalar, temizlik için kullanırsınız. Ruby ayrıca daha temiz kod için metod düzeyinde rescue'ye izin verir (açık olmadan).
ensureraiserescueensurebeginbegin
result = risky_operation
rescue ArgumentError => e # rescue a SPECIFIC exception type
puts "Bad argument: #{e.message}"
rescue StandardError => e # broader catch (StandardError, not Exception)
puts "Error: #{e.message}"
retry if attempts < 3 # retry can re-run the begin block
else
puts "succeeded" # runs if NO exception
ensure
cleanup # ALWAYS runs (success or failure)
end
begin/rescue/ensure Ruby'nin try/catch/finally'sidir. Belirli türleri rescue edin (rescue ArgumentError), garantili temizlik için ensure kullanın ve hata olmayan durum için else kullanın. retry bloğu yeniden deneyebilir.
rescue => e # ✅ bare rescue catches StandardError (the right default)
rescue StandardError # ✅ explicit, same thing
rescue Exception # ❌ AVOID — catches EVERYTHING including system signals
# (Interrupt/Ctrl-C, SystemExit) — can break the program
Önemli: bare rescue StandardError'ı yakalar (uygulama hataları için doğru varsayılan). Exception'ı (kökü) rescue etmek her şeyi yakalar; Interrupt (Ctrl-C) ve SystemExit gibi sistem düzeyindeki sinyalleri de kapsayan — bunu genellikle yakalamak istemezsiniz, çünkü programın kesintiye uğramasını veya düzgün şekilde çıkmasını engelleyebilir. Ruby'de yaygın bir hata.
raise ArgumentError, "Amount must be positive" # raise a built-in
raise "Something failed" # raises RuntimeError
# custom exception class
class InsufficientFundsError < StandardError # inherit from StandardError
def initialize(msg = "Not enough funds")
super
end
end
raise InsufficientFundsError
def process
do_work
rescue => e # rescue WITHOUT begin — applies to the whole method body
handle(e)
ensure
cleanup
end
Doğru istisna işleme robust Ruby uygulamaları için gereklidir ve Ruby'nin yaklaşımını — belirli idiomlarını ve uyarılarını da kapsayan — anlamak önemlidir.
begin/rescue/ensure yapısı (Ruby'nin try/catch/finally'si), belirli istisna türlerini rescue etmek, garantili temizlik için ensure kullanmak ve temiz metod düzeyinde rescue (açık begin olmadan) temel, günlük bilgidir.
Bir özellikle önemli ve açıkça Ruby'ye özgü nokta StandardError vs Exception ayrımı'dır: bare rescue (ve doğru varsayılan) StandardError'ı yakalar, ancak Exception'ı (hiyerarşinin kökü) rescue etmek her şeyi yakalar — Interrupt (Ctrl-C) ve SystemExit gibi sistem sinyallerini de — ki bunu neredeyse hiç istemezsiniz, çünkü programın kesintiye uğramasını veya düzgün şekilde çıkmasını engelleyebilir ve yaygın, zararlı bir hatadır.
Uygulama hataları için StandardError'ı (Exception değil) rescue etmeniz gerektiğini anlamak gerçek hataları önleyen önemli bir Ruby'ye özgü bilgidir.
Yapıyı, özel istisna sınıflarını (StandardError'dan devralırlar), retry'ı, metod düzeyinde rescue idiomunu ve özellikle StandardError-not-Exception uyarısını bilmek hataları zarif bir şekilde işleyen ve programın kesintiye uğramasını kırmayan robust, doğru Ruby yazmak için önemlidir.
İşlenmeyen hatalar ve Exception-rescue hatası hem de gerçek sorunlara neden olduğundan, Ruby'nin istisna işlemeyi uzmanlaşmak — yapısı, idiomları ve kritik StandardError vs Exception ayrımı — güvenilir Ruby geliştirme ve yaygın bir mülakat konusu için önemli, sık ilgili bilgidir.
Junior'dan Senior'a detaylı cevaplarla bir BT mülakat soruları kütüphanesi.
Bağış Yap