2012-02-02 24 views
11

Mam dwa programy obsługi rescue_from, program obsługi 404 i catch all handler. Połów zawsze wywołuje wyjątki ActiveRecord :: RecordNotFound, a program obsługi 404 nigdy nie jest wywoływany. Oczekuję, że program obsługi o większej specyficzności zostanie wywołany, ale tak się nie stanie.Jak określić, który program obsługi wyjątków rescue_from wybierze w Railsach?

application_controller.rb

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

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

api docs for rescue_from mówi co następuje:

wysuwane są dziedziczone. Są wyszukiwane od prawej do lewej, od od dołu do góry i do góry w hierarchii. Program obsługi pierwszej klasy , dla którego jest spełniony wyjątek.is_a? (Klass), to ten, który jest wywoływany, jeśli jest dowolny.

Czy interpretuję błędne oświadczenie. Jak uzyskać zachowanie, którego szukam?

Odpowiedz

13

Procedura obsługi 404 nie jest wywoływana, ponieważ blokada zawsze jest najpierw wywoływana w twoim przykładzie. Problem polega na uporządkowaniu definicji procedur obsługi. Są one oceniane od dołu do góry, co oznacza, że ​​ostatni zdefiniowany moduł obsługi ma najwyższy priorytet, a pierwszy zdefiniowany moduł obsługi ma najniższy priorytet. Jeśli zmienisz zamówienie, otrzymasz pożądane zachowanie.

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

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

Próbowałem nawet wcześniej i wydawało się, że nie działa, ale teraz tak jest. Dzięki. –

+2

Proponuję nigdy nie ratować "Wyjątku", ponieważ jest on boginią matki wszystkich innych wyjątków. To nawet uratuje twoje błędy składniowe lub cokolwiek innego. – Hendrik

+1

StandardError byłby klasą typu catch-all. – Duke

Powiązane problemy