Menu
Coddy logo textTech

Mehrere rescue-Klauseln

Teil des Abschnitts Logik & Programmfluss der Ruby-Journey von Coddy — Lektion 45 von 56.

Ein begin-Block kann mehrere rescue-Klauseln haben. Ruby prüft diese von oben nach unten und führt die erste aus, deren Exception-Klasse ü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."
end

Die Reihenfolge ist wichtig: Listen Sie spezifische Klassen vor allgemeinen auf. StandardError an erster Stelle würde alles abfangen, und die späteren Zweige würden niemals ausgeführt werden.

Sie können auch mehrere Exception-Klassen in einem Zweig abfangen, indem Sie diese mit Kommas auflisten:

begin
  risky_call
rescue ArgumentError, TypeError => e
  puts "Bad input: #{e.message}"
end

Verwenden Sie dies, wenn der Wiederherstellungscode für mehrere Fehlermodi derselbe ist.

challenge icon

Aufgabe

Einfach

Lies zwei Zeilen von der Eingabe ein, die beide Ganzzahlen sein sollen. Verwende Integer(...) für beide und teile dann die erste durch die zweite.

Behandle drei Fälle mit separaten rescue-Zweigen:

  • ArgumentError → gib Bad number! aus
  • ZeroDivisionError → gib Cannot divide by zero! aus
  • TypeError → gib Wrong type! aus

Wenn alles funktioniert, gib Result: <a / b> aus (Ganzzahldivision).

Für die Eingabe 10 / 2 ist die Ausgabe Result: 5. Für 10 / 0, Cannot divide by zero!. Für 10 / abc, Bad number!.

Spickzettel

Ein begin-Block kann mehrere rescue-Klauseln haben – Ruby gleicht diese von oben nach unten ab:

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."
end

Listen Sie spezifische Exception-Klassen vor allgemeinen auf – eine allgemeine Klasse wie StandardError, die an erster Stelle steht, würde alle nachfolgenden Zweige abfangen.

Fangen Sie mehrere Exception-Klassen in einem Zweig ab, indem Sie diese durch Kommas trennen:

rescue ArgumentError, TypeError => e
  puts "Bad input: #{e.message}"

Probier es selbst

raw_a = gets.chomp
raw_b = gets.chomp

# TODO: begin ... rescue ArgumentError ... rescue ZeroDivisionError ... rescue TypeError ... end
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