Mehrere rescue-Klauseln
Teil des Abschnitts Logik & Programmfluss der Ruby-Journey von Coddy. Lektion 45 von 56.
Ein begin-Block kann mehrere rescue-Klauseln enthalten. Ruby prüft sie von oben nach unten und führt die erste aus, deren Ausnahmeklasse übereinstimmt.
begin
number = Integer(gets.chomp)
result = 100 / number
puts result
rescue ArgumentError
puts "That's not a valid number."
rescue ZeroDivisionError
puts "Can't divide by zero."
endDie Reihenfolge ist wichtig: Führe spezifische Klassen vor allgemeinen auf. Wenn StandardError an erster Stelle steht, würde es alles abfangen, und die späteren Zweige würden nie ausgeführt.
Du kannst auch mehrere Fehlerklassen in einem Zweig abfangen, indem du sie durch Kommas getrennt auflistest:
begin
risky_call
rescue ArgumentError, TypeError => e
puts "Bad input: #{e.message}"
endVerwende dies, wenn der Wiederherstellungscode für mehrere Fehlerarten gleich ist.
Aufgabe
EinfachLies zwei Zeilen aus input, die beide als ganze Zahlen gedacht sind. Verwende für beide Integer(...) und teile anschließend die erste durch die zweite.
Behandle drei Fälle mit separaten rescue-Zweigen:
ArgumentError→ gibBad number!ausZeroDivisionError→ gibCannot divide by zero!ausTypeError→ gibWrong type!aus
Wenn alles funktioniert, gib Result: <a / b> aus (Ganzzahldivision).
Für 10 / 2 lautet die Ausgabe Result: 5. Für 10 / 0 lautet sie Cannot divide by zero!. Für 10 / abc lautet sie Bad number!.
Probier es selbst
raw_a = gets.chomp
raw_b = gets.chomp
# TODO: begin ... rescue ArgumentError ... rescue ZeroDivisionError ... rescue TypeError ... end
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