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


Antworten:


223

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

def foo
  ...
rescue
  ...
end

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'


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!


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.