try...catch in Ruby

Nurudeen Ibrahim 18 April 2022
  1. Rettung mit einer generischen Fehlermeldung in Ruby
  2. Rettung mit der Nachricht aus der Ausnahme in Ruby
  3. Retten Sie einen bestimmten Ausnahmetyp in Ruby
try...catch 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.