2013-05-19 11 views
9

Quando il salvataggio da un'eccezione, ci sono due modi per fare riferimento all'eccezione sollevata:

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

e

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

credo che siano intercambiabili, ma sono? C'è qualche situazione in cui uno dovrebbe essere usato rispetto all'altro?

+0

Qui ci sono troppi ['esempi'] (http://stackoverflow.com/search?q=inline+rescue) tranne questo. –

risposta

9

Penso anche che questi snippet siano intercambiabili. Ma dovresti sempre preferire le variabili esplicite alla magia globale del thread.

un caso in cui la magia $! var è a portata di mano:

result_or_error = perform_some_operation() rescue $! 

Per coloro che non sanno che questa linea significa:

E 'così chiamato "inline salvataggio". Il formato è questo:

<expr1> rescue <expr2> 

In primo luogo, expr1 viene valutata. Se non è stata sollevata alcuna eccezione, viene restituito il suo valore. Ma se c'è stata un'eccezione, allora viene valutato expr2 e viene restituito il suo valore.

Quindi, in questo caso, se perform_some_operation() ha generato un'eccezione, la variabile result_or_error dovrebbe essere impostata su un'istanza di tale eccezione (poiché $! restituisce l'ultimo errore).

+0

Puoi spiegare che cosa fa per favore? –

+0

Aggiornamento della risposta –

+1

Grazie. Questo è davvero fantastico. –

Problemi correlati