2016-09-26 4 views
0

Nous utilisons Raven-sentry dans notre application et je voudrais avoir un ensemble d'options supplémentaires 'catch all' par défaut appliqué à toutes les erreurs.Rails exceptions - obtenir des variables d'instance à partir du contrôleur

class StandardError 
    def raven_context 
    extra = {} 

    #add conditional key/values to the hash if they exist 
    extra[:account_id] = @account.id if @account 

    extra.empty? ? {} : { extra: extra } 
    end 
end 

Parce que l'exception soulève d'une classe instanciée soit un modèle ou d'un contrôleur, je pensais que je serais en mesure d'accéder à ces variables. Si accounts # show a déclenché une exception, je souhaiterais pouvoir accéder à @account. Si Account.create() a déclenché une exception, j'aimerais pouvoir obtenir des informations sur ce compte, comme des erreurs.

Est-ce possible? et si oui, comment?

Répondre

0

Vous pouvez suivre les Rails idea de comment attraper/soulever l'exception telles que ActiveRecord::RecordInvalid

Vous pouvez donc essentiellement concevoir une erreur générique comme:

class MyGenericError < StandardError 
    attr_reader :account, :others 

    def initialize(message = nil, account = nil, others={}) 
    @account = account 
    @others = others 
    super(message) 
    end 
end 

class MySpecificError < MyGenericError; end 

Alors maintenant, quand vous soulevez une erreur, juste passer les params nécessaires comme:

raise MySpecificError.new('doing something wrong', @account) if doing_something_wrong 

Enfin, lors de la capture de l'erreur, vous obtenez juste le account attribu te et l'utilise librement

+0

Le seul problème ici est que ce seront des erreurs que j'élèverai spécifiquement. Avec Sentry, je peux passer toutes les informations à travers Raven.capture_exception (e, extra: {ce que je veux}). Sentry capture également des exceptions non gérées, ce sont celles qui m'intéressent particulièrement. – TIMBERings