2012-02-02 12 views
11

Ho due operatori rescue_from, un gestore 404 e un catch all handler. Il catch viene sempre chiamato per le eccezioni ActiveRecord :: RecordNotFound e il gestore 404 non viene mai chiamato. La mia aspettativa è che venga chiamato il gestore con più specificità, ma questo non accade.Come determinare quale gestore di eccezioni rescue_from sceglierà in Rails?

application_controller.rb

# ActiveRecord 404 
rescue_from ActiveRecord::RecordNotFound do |e| 
    ... 
end 

# Catch all unhandled exceptions 
rescue_from Exception do |e| 
    ... 
end 

Il api docs for rescue_from dice il seguente:

gestori sono ereditate. Vengono cercati da destra a sinistra, da dal basso verso l'alto e in alto nella gerarchia. Il gestore della prima classe per cui exception.is_a? (Klass) è valido è quello invocato, se qualsiasi.

Sto interpretando la frase about errata. Come ottengo un comportamento che sto cercando?

risposta

13

L'handler 404 non viene mai chiamato perché il catch viene sempre chiamato per primo nel tuo esempio. Il problema è nell'ordinare le definizioni del gestore. Vengono valutati dal basso verso l'alto, il che significa che l'ultimo gestore definito avrà la priorità più alta e il primo gestore definito avrà la priorità più bassa. Se cambi l'ordine, otterrai il comportamento che desideri.

# Catch all unhandled exceptions 
rescue_from Exception do |e| 
    ... 
end 

# ActiveRecord 404 
rescue_from ActiveRecord::RecordNotFound do |e| 
    ... 
end 
+0

L'ho provato anche prima e non sembrava funzionare ma ora lo fa. Grazie. –

+2

Suggerisco di non salvare mai "Eccezione" poiché è la divinità madre di tutte le altre eccezioni. Questo potrebbe anche salvare i tuoi errori di sintassi o qualsiasi altra cosa. – Hendrik

+1

StandardError sarebbe la classe catch-all. – Duke

Problemi correlati