2013-05-19 11 views
9

Wenn von einer Ausnahme zu retten, gibt es zwei Möglichkeiten, um die angehobenen Ausnahme zu verweisen:

begin 
    ... 
rescue Exception => e 
    handle_the_error(e) 
end 

und

begin 
    ... 
rescue Exception 
    handle_the_error($!) 
end 

Ich glaube, sie sind austauschbar, aber sind sie? Gibt es eine Situation, in der man gegenüber dem anderen verwendet werden sollte?

+0

Hier sind zu viele ['Beispiele'] (http://stackoverflow.com/search?q=inline+rescue) außer diesem. –

Antwort

9

Ich denke auch, dass diese Schnipsel austauschbar sind. Aber du solltest immer explizite Variablen der thread-globalen Magie vorziehen.

Ein Fall, in dem $! Magie var ist praktisch:

result_or_error = perform_some_operation() rescue $! 

Für diejenigen, die nicht wissen, dass diese Linie bedeutet:

Es ist so "Inline-Rettung" genannt. Format ist dies:

<expr1> rescue <expr2> 

Zuerst expr1 ausgewertet wird. Wenn keine Ausnahme ausgelöst wurde, wird der Wert zurückgegeben. Wenn jedoch eine Ausnahme aufgetreten ist, wird expr2 ausgewertet und der Wert zurückgegeben.

Also, in diesem Fall, wenn perform_some_operation() eine Ausnahme ausgelöst, würde Variable result_or_error auf eine Instanz dieser Ausnahme gesetzt werden (weil $! letzten Fehler zurückgibt).

+0

Können Sie bitte erklären, was das macht? –

+0

Die Antwort wurde aktualisiert –

+1

Danke. Das ist eigentlich ziemlich toll. –

Verwandte Themen