Catch toutes les exceptions dans un contrôleur de rails

Existe-t-il un moyen de détecter toutes les exceptions non corrigées dans un contrôleur de rails, comme ceci:

def delete schedule_id = params[:scheduleId] begin Schedules.delete(schedule_id) rescue ActiveRecord::RecordNotFound render :json => "record not found" rescue ActiveRecord::CatchAll #Only comes in here if nothing else catches the error end render :json => "ok" end 

Je vous remercie

 begin # do something dodgy rescue ActiveRecord::RecordNotFound # handle not found error rescue ActiveRecord::ActiveRecordError # handle other ActiveRecord errors rescue # StandardError # handle most other errors rescue Exception # handle everything else raise end 

Vous pouvez également définir une méthode rescue_from.

 class ApplicationController < ActionController::Base rescue_from ActionController::RoutingError, :with => :error_render_method def error_render_method respond_to do |type| type.xml { render :template => "errors/error_404", :status => 404 } type.all { render :nothing => true, :status => 404 } end true end end 

Selon votre objective, vous pouvez également envisager de ne PAS gérer les exceptions par contrôleur. Au lieu de cela, utilisez quelque chose comme le gem exception_handler pour gérer les réponses aux exceptions de manière cohérente. En prime, cette approche va également gérer les exceptions qui se produisent au niveau de la couche middleware, telles que l’parsing des requêtes ou les erreurs de connexion à la firebase database que votre application ne voit pas. La gemme d’ exception_notifier pourrait également vous intéresser.

Vous pouvez intercepter des exceptions par type:

 rescue_from ::ActiveRecord::RecordNotFound, with: :record_not_found rescue_from ::NameError, with: :error_occurred rescue_from ::ActionController::RoutingError, with: :error_occurred # Don't resuce from Exception as it will resuce from everything as mentioned here "http://stackoverflow.com/questions/10048173/why-is-it-bad-style-to-rescue-exception-e-in-ruby" Thanks for @Thibaut Barrère for mention that # rescue_from ::Exception, with: :error_occurred protected def record_not_found(exception) render json: {error: exception.message}.to_json, status: 404 return end def error_occurred(exception) render json: {error: exception.message}.to_json, status: 500 return end 

rescue sans arguments sauvera toute erreur.

Donc, vous voudrez:

 def delete schedule_id = params[:scheduleId] begin Schedules.delete(schedule_id) rescue ActiveRecord::RecordNotFound render :json => "record not found" rescue #Only comes in here if nothing else catches the error end render :json => "ok" end 

En fait, si vous voulez vraiment tout attraper, il vous suffit de créer votre propre application d’exceptions, qui vous permet de personnaliser le comportement généralement géré par le middleware PublicExceptions: https://github.com/rails/rails/blob/4-2 -stable / actionpack / lib / action_dispatch / middleware / public_exceptions.rb

Un tas d’autres réponses partagent des gemmes qui le font pour vous, mais il n’y a vraiment aucune raison pour laquelle vous ne pouvez pas simplement les regarder et le faire vous-même.

Une mise en garde: assurez-vous de ne jamais déclencher une exception dans votre gestionnaire d’exceptions. Sinon, vous obtenez un horrible FAILSAFE_RESPONSE https://github.com/rails/rails/blob/4-2-stable/actionpack/lib/action_dispatch/middleware/show_exceptions.rb#L4-L22

BTW, le comportement dans le contrôleur vient de secours: https://github.com/rails/rails/blob/4-2-stable/activesupport/lib/active_support/rescuable.rb#L32-L51