ensure und raise
Teil des Abschnitts Logik & Programmfluss der Ruby-Journey von Coddy. Lektion 46 von 56.
Zwei weitere Bausteine vervollständigen das Toolkit zur Fehlerbehandlung.
ensure ist ein Block, der auf jeden Fall ausgeführt wird – unabhängig davon, ob begin normal beendet wurde, ein rescue-Zweig eine Ausnahme abgefangen hat oder die Ausnahme sogar nicht abgefangen wurde. Hier platzierst du Bereinigungscode:
begin
puts "opening file"
raise "something broke"
rescue
puts "caught it"
ensure
puts "closing file"
end
# Datei öffnen
# abgefangen
# Datei schließenraise dient dazu, deine eigene Ausnahme zu erstellen. Übergebe eine Zeichenfolge für die Nachricht oder eine Klasse zusammen mit einer Nachricht:
def withdraw(amount)
raise ArgumentError, "amount must be positive" if amount <= 0
# ... führe die Auszahlung durch
endDie Konvention besteht darin, frühzeitig, am Anfang einer Methode, raise zu verwenden, um bei falschen Argumenten schnell fehlzuschlagen. Der Aufrufer kann rescue verwenden, wenn eine sinnvolle Wiederherstellung möglich ist, oder den Fehler weiter nach oben propagieren lassen.
Aufgabe
EinfachDefiniere eine Methode safe_divide(a, b), die:
ArgumentErrormit der Meldung"b cannot be zero"auslöst, wennb == 0- Andernfalls
a / bzurückgibt
Lies anschließend zwei Ganzzahlen aus der Eingabe. Rufe safe_divide innerhalb von begin / rescue / ensure auf:
- Bei Erfolg gib
Result: <value>aus - Bei
ArgumentErrorgibError: <message>aus - Gib in
ensureimmerDone.aus
Für die Eingabe 10 / 2 lautet die Ausgabe:
Result: 5
Done.Für die Eingabe 10 / 0:
Error: b cannot be zero
Done.Probier es selbst
# TODO: definiere safe_divide(a, b), wirft ArgumentError wenn b == 0
a = gets.to_i
b = gets.to_i
# TODO: begin ... print Result; rescue ArgumentError => e ... print Error; ensure ... print Done.
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Programmfluss
1Strings im Detail
Überblick über String-MethodenString-InterpolationStrings durchlaufenSplitten und VerbindenRückblick – String Weaver4Blocks, Procs & Lambdas
Was ist ein Block?do..end vs. geschweifte KlammernDas Schlüsselwort yieldBlock-ParameterProcs und LambdasRückblick – Benutzerdefinierter Iterator2Bereiche
Was ist ein Bereich?BereichsmethodenBereiche in Case / WhenWiederholung – Übung zu Bereichen5Das Enumerable-Kraftpaket
Select und RejectMap verkettenReduce / Injectcount, all?, any?, none?group_by und partitionsort_by, min_by, max_byZusammenfassung – Datenpipeline8Fortgeschrittene Entscheidungsfindung
Case mit Klassen & Regexwhen mit mehreren WertenTernärer OperatorInline-if / unlessRückblick – Notenklassifizierer32D-Arrays
Grundlagen von 2D-ArraysZugriff auf 2D-ElementeDurchlaufen von 2D-ArraysGängige 2D-MusterRückblick – Matrixoperationen6Projekt – Bibliotheksverwaltung
ProjektübersichtBuch hinzufügen9Fehlerbehandlung
Was ist eine Exception?begin / rescueMehrere rescue-Klauselnensure und raiseRückblick – Sicherer TaschenrechnerÜbe selbstständig: Online-Ruby-Compiler