Menu
Coddy logo textTech

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.

challenge icon

Aufgabe

Einfach

Lies 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 einen ArgumentError bei 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!"
end

Fangen Sie das Ausnahme-Objekt mit => e ab, um auf dessen Nachricht zuzugreifen:

begin
  Integer("hello")
rescue ArgumentError => e
  puts "Bad input: #{e.message}"
end

Die 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
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Logik & Programmfluss