ensure und raise
Teil des Abschnitts Logik & Programmfluss der Ruby-Journey von Coddy — Lektion 46 von 56.
Zwei weitere Teile vervollständigen das Toolkit zur Fehlerbehandlung.
ensure ist ein Block, der egal was passiert ausgeführt wird, egal ob begin normal beendet wurde, oder ein rescue-Zweig eine Ausnahme abgefangen hat, oder sogar wenn die Ausnahme nicht abgefangen wurde. Hier platzieren Sie den Bereinigungscode:
begin
puts "opening file"
raise "something broke"
rescue
puts "caught it"
ensure
puts "closing file"
end
# Datei wird geöffnet
# abgefangen
# Datei wird geschlossenMit raise erstellen Sie Ihre eigene Exception. Übergeben Sie einen String für die Nachricht oder eine Klasse zusammen mit einer Nachricht:
def withdraw(amount)
raise ArgumentError, "amount must be positive" if amount <= 0
# ... führen Sie die Abhebung durch
endDie Konvention ist, frühzeitig am Anfang einer Methode ein raise auszulösen, um bei falschen Argumenten schnell abzubrechen (fail fast). Der Aufrufer kann ein rescue durchführen, falls eine sinnvolle Fehlerbehandlung möglich ist, oder den Fehler weiter nach oben durchreichen.
Aufgabe
EinfachDefiniere eine Methode safe_divide(a, b), die:
- Einen
ArgumentErrormit der Nachricht"b cannot be zero"auslöst, wennb == 0ist - Andernfalls
a / bzurückgibt
Lies dann zwei Ganzzahlen von der Eingabe ein. Rufe safe_divide innerhalb von begin / rescue / ensure auf:
- Bei Erfolg gib
Result: <value>aus - Bei einem
ArgumentErrorgibError: <message>aus - Gib in
ensureimmerDone.aus
Für die Eingabe 10 / 2 ist die Ausgabe:
Result: 5
Done.Für die Eingabe 10 / 0:
Error: b cannot be zero
Done.Spickzettel
ensure wird in jedem Fall ausgeführt (normales Beenden, abgefangen oder nicht abgefangene Exception) — verwenden Sie es für Bereinigungsarbeiten:
begin
raise "something broke"
rescue
puts "caught it"
ensure
puts "always runs"
endraise erzeugt eine Exception. Übergeben Sie eine Klasse und eine Nachricht, um einen bestimmten Typ auszulösen:
raise ArgumentError, "amount must be positive" if amount <= 0Konvention: Lösen Sie Exceptions frühzeitig am Anfang einer Methode aus, um bei ungültigen Argumenten schnell abzubrechen (fail fast).
Probier es selbst
# TODO: definiere safe_divide(a, b), löst ArgumentError aus, wenn b == 0
a = gets.to_i
b = gets.to_i
# TODO: begin ... Resultat ausgeben; rescue ArgumentError => e ... Fehler ausgeben; ensure ... Fertig ausgeben.
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
String-Methoden im ÜberblickString-InterpolationIterieren über StringsSplit und JoinRückblick – String Weaver4Blöcke, Procs & Lambdas
Was ist ein Block?do..end vs. geschweifte KlammernDas yield-SchlüsselwortBlock-ParameterProcs und LambdasZusammenfassung – Eigener Iterator7Hashes Teil 2
Hash.new mit StandardwertenIterieren über HashesVerschachtelte HashesZusammenführen und TransformierenRückblick – Häufigkeitszähler10Projekt - Studentenverwaltung
ProjektübersichtStudent hinzufügen5Enumerable-Kraftpaket
Select und RejectMap-VerkettungReduce / Injectcount, all?, any?, none?group_by und partitionsort_by, min_by, max_byZusammenfassung – Data Pipeline8Fortgeschrittene Entscheidungslogik
Case mit Klassen & RegexMulti-Value whenTernärer OperatorInline if / unlessRückblick – Noten-Klassifizierer32D-Arrays
2D-Array GrundlagenZugriff auf 2D-ElementeIterieren über 2D-ArraysGängige 2D-MusterZusammenfassung – Matrix-Operationen6Projekt - Bibliotheksverwaltung
ProjektübersichtBuch hinzufügen9Fehlerbehandlung
Was ist eine Exception?begin / rescueMehrere rescue-Klauselnensure und raiseZusammenfassung – Sicherer Taschenrechner