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 riskanten Code mit begin ... rescue ... end. Wenn innerhalb von begin ein Fehler auftritt, 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 Exception-Objekt selbst mit => e abgreifen und dessen .message auslesen:
begin
Integer("hello")
rescue ArgumentError => e
puts "Bad input: #{e.message}"
end
# Bad input: invalid value for Integer(): "hello"Wenn Sie keine Exception-Klasse angeben, fängt rescue für sich allein StandardError und dessen Unterklassen ab, also die meisten alltäglichen Fehler. Das Abfangen ist am nützlichsten, wenn Sie im rescue-Block etwas tun können: 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 Zeile ist möglicherweise keine gültige Zahl.
Umschließe das Parsen der zweiten Zeile mit begin / rescue:
- Verwende
Integer(input)(was einenArgumentErrorbei einer ungültigen Zeichenfolge auslö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!.
Spickzettel
Verwenden Sie begin ... rescue ... end, um Ausnahmen zu behandeln, ohne dass das Programm abstürzt:
begin
result = 10 / 0
rescue ZeroDivisionError
puts "Cannot divide by zero!"
endFangen Sie das Ausnahme-Objekt mit => e ab, um auf dessen Nachricht zuzugreifen:
begin
Integer("hello")
rescue ArgumentError => e
puts "Bad input: #{e.message}"
endDie Verwendung von rescue ohne Klasse fängt StandardError und deren Unterklassen ab.
Probier es selbst
a = gets.to_i
raw_b = gets.chomp
# TODO: begin/rescue um Integer(raw_b) herum; Summe oder "Bad number!" 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