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
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
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
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.