Menu
Coddy logo textTech

ensure ve raise

Coddy'nin Ruby Journey'sinin Mantık ve Akış bölümünün bir parçası — ders 46 / 56.

Hata işleme araç setini iki parça daha tamamlıyor.

ensure; begin bloğu normal şekilde tamamlansa da, bir rescue dalı bir istisnayı yakalasa da, hatta istisna yakalanmamış olsa bile ne olursa olsun çalışan bir bloktur. Temizleme kodunu buraya yazarsınız:

begin
  puts "opening file"
  raise "something broke"
rescue
  puts "caught it"
ensure
  puts "closing file"
end
# dosya açılıyor
# yakalandı
# dosya kapatılıyor

raise, kendi istisnanızı oluşturma yönteminizdir. Mesaj için bir dize veya bir sınıf ile birlikte bir mesaj iletin:

def withdraw(amount)
  raise ArgumentError, "amount must be positive" if amount <= 0
  # ... para çekme işlemini yapın
end

Genel kural, argümanlar yanlış olduğunda hızlıca hata vermek (fail fast) için bir metodun en başında raise etmektir. Çağıran taraf, mantıklı bir kurtarma yolu varsa rescue edebilir veya hatanın yukarı yayılmasına izin verebilir.

challenge icon

Görev

Kolay

Aşağıdakileri gerçekleştiren bir safe_divide(a, b) metodu tanımlayın:

  • Eğer b == 0 ise "b cannot be zero" mesajıyla birlikte bir ArgumentError hatası fırlatır
  • Aksi takdirde a / b sonucunu döndürür

Ardından girdiden iki tam sayı okuyun. safe_divide metodunu begin / rescue / ensure blokları içinde çağırın:

  • Başarılı olduğunda, Result: <value> yazdırın
  • ArgumentError durumunda, Error: <message> yazdırın
  • ensure bloğunda, her zaman Done. yazdırın

10 / 2 girdisi için çıktı şöyledir:

Result: 5
Done.

10 / 0 girdisi için:

Error: b cannot be zero
Done.

Kopya kağıdı

ensure ne olursa olsun çalışır (normal çıkış, kurtarılmış veya yakalanmamış istisna) — temizlik işlemleri için kullanın:

begin
  raise "something broke"
rescue
  puts "caught it"
ensure
  puts "always runs"
end

raise bir istisna oluşturur. Belirli bir türü yükseltmek için bir sınıf ve mesaj geçirin:

raise ArgumentError, "amount must be positive" if amount <= 0

Gelenek: hatalı argümanlarda hızlıca başarısız olmak için bir metodun en başında erkenden raise kullanın.

Kendin dene

# YAPILACAK: safe_divide(a, b) tanımlayın, b == 0 olduğunda ArgumentError hatası fırlatır

a = gets.to_i
b = gets.to_i

# YAPILACAK: begin ... Result yazdır; rescue ArgumentError => e ... Error yazdır; ensure ... Done yazdır.
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Mantık ve Akış bölümündeki tüm dersler