Menu
Coddy logo textTech

ensure und raise

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

Zwei weitere Teile vervollständigen das Toolkit zur Fehlerbehandlung.

ensure ist ein Block, der egal was passiert ausgeführt wird, egal ob begin normal beendet wurde, oder ein rescue-Zweig eine Ausnahme abgefangen hat, oder sogar wenn die Ausnahme nicht abgefangen wurde. Hier platzieren Sie den Bereinigungscode:

begin
  puts "opening file"
  raise "something broke"
rescue
  puts "caught it"
ensure
  puts "closing file"
end
# Datei wird geöffnet
# abgefangen
# Datei wird geschlossen

Mit raise erstellen Sie Ihre eigene Exception. Übergeben Sie einen String für die Nachricht oder eine Klasse zusammen mit einer Nachricht:

def withdraw(amount)
  raise ArgumentError, "amount must be positive" if amount <= 0
  # ... führen Sie die Abhebung durch
end

Die Konvention ist, frühzeitig am Anfang einer Methode ein raise auszulösen, um bei falschen Argumenten schnell abzubrechen (fail fast). Der Aufrufer kann ein rescue durchführen, falls eine sinnvolle Fehlerbehandlung möglich ist, oder den Fehler weiter nach oben durchreichen.

challenge icon

Aufgabe

Einfach

Definiere eine Methode safe_divide(a, b), die:

  • Einen ArgumentError mit der Nachricht "b cannot be zero" auslöst, wenn b == 0 ist
  • Andernfalls a / b zurückgibt

Lies dann zwei Ganzzahlen von der Eingabe ein. Rufe safe_divide innerhalb von begin / rescue / ensure auf:

  • Bei Erfolg gib Result: <value> aus
  • Bei einem ArgumentError gib Error: <message> aus
  • Gib in ensure immer Done. aus

Für die Eingabe 10 / 2 ist die Ausgabe:

Result: 5
Done.

Für die Eingabe 10 / 0:

Error: b cannot be zero
Done.

Spickzettel

ensure wird in jedem Fall ausgeführt (normales Beenden, abgefangen oder nicht abgefangene Exception) — verwenden Sie es für Bereinigungsarbeiten:

begin
  raise "something broke"
rescue
  puts "caught it"
ensure
  puts "always runs"
end

raise erzeugt eine Exception. Übergeben Sie eine Klasse und eine Nachricht, um einen bestimmten Typ auszulösen:

raise ArgumentError, "amount must be positive" if amount <= 0

Konvention: Lösen Sie Exceptions frühzeitig am Anfang einer Methode aus, um bei ungültigen Argumenten schnell abzubrechen (fail fast).

Probier es selbst

# TODO: definiere safe_divide(a, b), löst ArgumentError aus, wenn b == 0

a = gets.to_i
b = gets.to_i

# TODO: begin ... Resultat ausgeben; rescue ArgumentError => e ... Fehler ausgeben; ensure ... Fertig 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