Wie benutzt man Rettung in Ruby ohne den Anfangs- und Endblock?

115

Ich kenne die Standardtechnik eines beginnenden Rettungsendes

Wie benutzt man den Rettungsblock alleine?

Wie funktioniert es und woher weiß es, welcher Code überwacht wird?

Sid
quelle

Antworten:

223

Eine Methode "def" kann als "begin" -Anweisung dienen:

def foo
  ...
rescue
  ...
end
alex.zherdev
quelle
3
Außerdem bilden Klassendefinitionen, Moduldefinitionen und (glaube ich) do/ endBlockliterale implizite Ausnahmeblöcke.
Jörg W Mittag
Kannst du auf jeden Fall auch das Ende sicherstellen?
Mohamed Hafez
Sie können auf jeden Fall auch die Rettung sicherstellen :-)
Antony
Kannst du mehr als eine Rettung in deinem Def verwenden?
Jane875
@riedjane875 Ja, Sie können mehrere Rettungen verwenden, entweder explizit (jede Rettungsklausel / jeder Rettungsblock in einer eigenen Zeile) wie rescue TypeError; rescue NameError- oder Sie können die Ausnahmeklassen durch Kommas trennen, z. B.rescue TypeError, NameError
chemturion
48

Sie können auch inline retten:

1 + "str" rescue "EXCEPTION!"

druckt "AUSNAHME!" da 'String kann nicht in Fixnum gezwungen werden'

Peku
quelle
1
Wie können Sie die Ausnahme-Backtrace inline retten und anzeigen?
Cyril Duchon-Doris
Wie kann ich die eigentliche Ausnahme zurückgeben?
user1735921
1
Inline-Rettung ist keine gute Vorgehensweise, da sie StandardErroralle ihre Unterklassen rettet , wie z. B. NameError- dass selbst ein Tippfehler in Ihrem Code keinen Fehler auslöst . Sieheoughtbot.com/blog/don-t-inline-rescue-in- Rubin .
BrunoFacca
26

Ich verwende die Def / Rescue-Kombination häufig mit ActiveRecord-Validierungen:

def create
   @person = Person.new(params[:person])
   @person.save!
   redirect_to @person
rescue ActiveRecord::RecordInvalid
   render :action => :new
end

Ich denke, das ist sehr schlanker Code!

Edwin V.
quelle
19

Beispiel:

begin
  # something which might raise an exception
rescue SomeExceptionClass => some_variable
  # code that deals with some exception
ensure
  # ensure that this code always runs
end

Hier defals beginAussage:

def
  # something which might raise an exception
rescue SomeExceptionClass => some_variable
  # code that deals with some exception
ensure
  # ensure that this code always runs
end
Hieu Le
quelle