web-dev-qa-db-fra.com

Comment déclencher une exception dans Rails afin qu'il se comporte comme les autres Rails exceptions?

Je voudrais soulever une exception de sorte qu'il fasse la même chose qu'une exception normale Rails fait. Spécifiquement, montrer l'exception et trace de la pile en mode de développement et montrer "Nous sommes désolés, mais quelque chose s'est mal passé "page en mode production.

J'ai essayé ce qui suit:

raise "safety_care group missing!" if group.nil?

Mais il écrit simplement "ERROR signing up, group missing!" au fichier development.log

89
Chirag Patel

Vous n'avez rien de spécial à faire, cela devrait simplement fonctionner.

Quand j'ai une nouvelle Rails avec ce contrôleur:

class FooController < ApplicationController
  def index
    raise "error"
  end
end

et allez à http://127.0.0.1:3000/foo/

Je vois l'exception avec une trace de pile.

Vous ne verrez peut-être pas l'intégralité de la pile dans le journal de la console car Rails (depuis la version 2.3) filtre les lignes de la trace de la pile provenant du framework lui-même. =

Voir config/initializers/backtrace_silencers.rb dans votre projet Rails

132
levinalex

Vous pouvez le faire comme ça:

class UsersController < ApplicationController
  ## Exception Handling
  class NotActivated < StandardError
  end

  rescue_from NotActivated, :with => :not_activated

  def not_activated(exception)
    flash[:notice] = "This user is not activated."
    Event.new_event "Exception: #{exception.message}", current_user, request.remote_ip
    redirect_to "/"
  end

  def show
      // Do something that fails..
      raise NotActivated unless @user.is_activated?
  end
end

Ce que vous faites ici est de créer une classe "NotActivated" qui servira d'exception. En utilisant la levée, vous pouvez lancer "NotActivated" comme une exception. rescue_from est le moyen d'attraper une exception avec une méthode spécifiée (not_activated dans ce cas). Un exemple assez long, mais il devrait vous montrer comment cela fonctionne.

Meilleurs vœux,
Fabien

60
halfdan

Si vous avez besoin d'un moyen plus simple de le faire et que vous ne voulez pas trop de problèmes, une exécution simple pourrait être:

raise Exception.new('something bad happened!')

Cela lèvera une exception, disons e avec e.message = something bad happened!

et ensuite vous pouvez le récupérer comme vous récupérez toutes les autres exceptions en général.

10
Sambhav Sharma