begin / rescue
Teil des Abschnitts Logik & Programmfluss der Ruby-Journey von Coddy. Lektion 44 von 56.
Um zu verhindern, dass eine Exception Ihr Programm zum Absturz bringt, umschließen Sie den risikobehafteten Code mit begin ... rescue ... end. Wenn etwas innerhalb von begin einen Fehler auslöst, springt Ruby zum passenden rescue-Block, anstatt abzubrechen.
begin
result = 10 / 0
puts result
rescue ZeroDivisionError
puts "Cannot divide by zero!"
end
# Kann nicht durch Null teilen!Sie können das Ausnahme-Objekt selbst mit => e abfangen und seine .message auslesen:
begin
Integer("hello")
rescue ArgumentError => e
puts "Bad input: #{e.message}"
end
# Ungültige Eingabe: invalid value for Integer(): "hello"Wenn du keine Ausnahme-Klasse angibst, fängt rescue allein StandardError und dessen Unterklassen ab, also die meisten alltäglichen Fehler. Das Abfangen ist am nützlichsten, wenn du im Rescue-Block etwas tun kannst: einen Standardwert einsetzen, das Problem protokollieren oder den Benutzer erneut fragen.
Aufgabe
EinfachLies zwei Zeilen von der Eingabe ein. Beide sollten Ganzzahlen sein, aber die zweite ist möglicherweise keine gültige Zahl.
Ummantele das Parsen der zweiten Zeile mit begin / rescue:
- Verwende
Integer(input)(was bei einem ungültigen String einenArgumentErrorauslöst) - Wenn das Parsen erfolgreich ist, gib
Sum: <a + b>aus - Wenn es fehlschlägt, gib
Bad number!aus
Für die Eingabe 3 und dann 4 lautet die Ausgabe Sum: 7. Für 3 und dann abc lautet sie Bad number!.
Probier es selbst
a = gets.to_i
raw_b = gets.chomp
# TODO: begin/rescue um Integer(raw_b); Summe ausgeben oder den exakten Text aus den Anweisungen
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