try...catch in Ruby
- Rettung mit einer generischen Fehlermeldung in Ruby
- Rettung mit der Nachricht aus der Ausnahme in Ruby
- Retten Sie einen bestimmten Ausnahmetyp in Ruby
Eine Ausnahme ist ein unerwünschtes Ereignis, das während der Ausführung eines Programms auftritt. Ein Beispiel ist ein ZeroDivisionError
, wenn ein Programm versucht, eine Zahl durch Null zu teilen. Das Retten einer Ausnahme ist eine Möglichkeit, sie elegant zu handhaben, damit das Programm nicht abstürzt.
Eine Ausnahme in Ruby besteht normalerweise aus zwei Klauseln, begin
und rescue
. Die Klausel begin
ist äquivalent zu try
in Python oder einer anderen ähnlichen Programmiersprache, während die Klausel rescue
äquivalent zu catch
ist. Unten ist die Syntax.
begin
# do something that might cause an exception
rescue
# handle the exception here
end
Lassen Sie uns ein einfaches Programm schreiben, das den Gewinnprozentsatz berechnet, wenn die Verkaufs- und Einstandspreise der Ware gegeben sind.
Beispielcodes:
def profit_percentage(selling_price, cost_price)
profit = selling_price - cost_price
"#{(profit.fdiv(cost_price) * 100)}%"
end
puts profit_percentage(30, 20)
puts profit_percentage(30, nil)
Ausgabe:
50.0%
nil can't be coerced into Integer (TypeError)
Wie wir in der obigen Ausgabe sehen können, hat der zweite Aufruf von profit_percentage
einen Fehler ausgelöst, weil wir nil
als cost_price
übergeben haben. Lassen Sie uns nun verschiedene Möglichkeiten veranschaulichen, wie wir diese Ausnahme hätten retten können.
Rettung mit einer generischen Fehlermeldung in Ruby
Das Retten mit einer generischen Fehlermeldung ist nicht immer hilfreich, da es die eigentliche Ursache der Ausnahme nicht offenbart.
Beispielcodes:
def profit_percentage(selling_price, cost_price)
begin
profit = selling_price - cost_price
"#{(profit.fdiv(cost_price) * 100)}%"
rescue
"An unknown error occurred."
end
end
puts profit_percentage(30, nil)
Ausgabe:
An unknown error occurred.
Rettung mit der Nachricht aus der Ausnahme in Ruby
Diese Methode ist praktisch, wenn Sie nicht an der Art der ausgelösten Ausnahme interessiert sind, sondern nur an der Fehlermeldung.
Beispielcodes:
def profit_percentage(selling_price, cost_price)
begin
profit = selling_price - cost_price
"#{(profit.fdiv(cost_price) * 100)}%"
rescue => e
e
end
end
puts profit_percentage(30, nil)
Ausgabe:
nil can't be coerced into Integer
Retten Sie einen bestimmten Ausnahmetyp in Ruby
Es ist hilfreich, wenn Sie daran interessiert sind, nur einen bestimmten Ausnahmetyp zu behandeln.
Beispielcodes:
def profit_percentage(selling_price, cost_price)
begin
profit = selling_price - cost_price
"#{(profit.fdiv(cost_price) * 100)}%"
rescue TypeError
"An argument of invalid type was detected"
end
end
puts profit_percentage(30, nil)
Ausgabe:
An argument of invalid type was detected
Erwähnenswert ist auch, dass es eine weitere optionale Klausel namens ensure
gibt, die in Fällen hilfreich sein kann, in denen Sie immer Code ausführen müssen, unabhängig davon, ob eine Ausnahme ausgelöst wurde oder nicht.
Beispielcodes:
def profit_percentage(selling_price, cost_price)
begin
profit = selling_price - cost_price
puts "#{(profit.fdiv(cost_price) * 100)}%"
rescue => e
puts e
ensure
puts "Done calculating profit %"
end
end
profit_percentage(30, 20)
profit_percentage(30, nil)
Ausgabe:
50.0%
Done calculating profit %
nil can't be coerced into Integer
Done calculating profit %
Wie in der obigen Ausgabe gezeigt, wurde der Code in der ensure
-Klausel in beiden Aufrufen von profit_percentage
ausgelöst. Diese Klausel wird normalerweise verwendet, wenn eine Datei nach einigen Dateioperationen geschlossen werden muss, unabhängig davon, ob eine Ausnahme aufgetreten ist oder nicht.