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ıyorraise, 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
endGenel 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.
Görev
KolayAşağıdakileri gerçekleştiren bir safe_divide(a, b) metodu tanımlayın:
- Eğer
b == 0ise"b cannot be zero"mesajıyla birlikte birArgumentErrorhatası fırlatır - Aksi takdirde
a / bsonucunu 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 ArgumentErrordurumunda,Error: <message>yazdırınensurebloğunda, her zamanDone.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"
endraise 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 <= 0Gelenek: 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.
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
1Derinlemesine Stringler
String Metotlarına Genel BakışString InterpolationStringler Üzerinde GezinmeSplit ve JoinÖzet - String Weaver4Bloklar, Procs ve Lambdalar
Blok Nedir?do..end ve Süslü Parantezleryield Anahtar KelimesiBlok ParametreleriProcs ve LambdalarÖzet - Özel İteratör7Hashes Bölüm 2
Varsayılan Değerlerle Hash.newHash Yapıları Üzerinde Yinelemeİç İçe Hash YapılarıBirleştirme ve DönüştürmeÖzet - Frekans Sayacı10Proje - Öğrenci Kayıtları
Projeye Genel BakışÖğrenci Ekle5Enumerable Gücü
Select ve RejectMap ZincirlemeReduce / Injectcount, all?, any?, none?group_by ve partitionsort_by, min_by, max_byÖzet - Data Pipeline8İleri Seviye Karar Yapıları
Sınıflar ve Regex ile CaseÇok Değerli whenTernary OperatörüSatır İçi if / unlessÖzet - Not Sınıflandırıcı32D Diziler
2D Dizi Temelleri2D Elemanlara Erişim2D Diziler Üzerinde YinelemeYaygın 2D KalıplarÖzet - Matris İşlemleri6Proje - Kütüphane Yöneticisi
Projeye Genel BakışKitap Ekle9Hata Yönetimi
İstisna Nedir?begin / rescueBirden Fazla rescue İfadesiensure ve raiseÖzet - Güvenli Hesap Makinesi