2009-04-19 8 views
6

Existe-t-il une bibliothèque ou un moyen facile d'intercepter les exceptions levées dans un programme Ruby et de les enregistrer dans un fichier? J'ai regardé sur log4r et logger, mais les docs sur les deux ne fournissent pas d'exemples sur la façon dont je le ferais. Je cours ce programme à distance et perd des poignées à stdout et à stderr, si cette information aide du tout.Enregistrement automatique des exceptions dans Ruby

Que recommanderiez-vous?

Répondre

14

Si vous voulez prendre une promenade sur le côté sauvage, essayez ceci:

class Exception 
    alias real_init initialize 
    def initialize(*args) 
    real_init *args 
    # log the error (self) or its args here 
    end 
end 

Ce intercepte la création de nouveaux objets d'exception au moment de la création.

+1

Merci Markus! Si le côté sauvage fonctionne, je suis plus que disposé à le faire! –

+0

upvoted pour la créativité! –

+4

C'est amusant mais je serais très méfiant de monkeypatching Exception ... –

4

Rescue de Exception. Quelque chose comme cela est probablement logique:

begin 
    # run your code here .. 
rescue Exception => exception 
    # logger.error(...) .... 
    raise exception 
end 

Ce consignera l'exception, et re-relancer pour que l'application soulève en fait une erreur en plus de l'exploitation forestière.

exception est une instance de Exception, jetez un oeil à the docs pour plus d'informations sur ce que vous pouvez faire avec cet objet (comme l'accès au backtrace).

+1

Hmm, c'est ce que j'avais peur de devoir faire. Le code impliqué est fondamentalement une classe avec un certain nombre de méthodes; devrais-je juste mettre un début/sauvetage sur chaque méthode ou est-il un moyen plus facile? –

+0

Vous créez probablement des instances quelque part - placez le bloc de secours dans lequel vous créez les instances. –

+0

Le mettre sur le code de création d'instance ne fera rien de bien sauf si l'erreur est dans la création. Si vous voulez attraper des erreurs, globalement, enveloppez votre corps principal. – MarkusQ

2

Si vous utilisez une application Rails, le plugin Exception Notification est très pratique.

+0

Ah oui, je l'ai certainement vu, mais mon application en question n'est pas une application Rails. Merci quand même! –

0

ça marcherait si je faisais quelque chose comme ceci:

begin 
    main() 
rescue Exception => e 
    myCustomErrorLogger(e) 
end 

def main() 
    # All the application code comes here. 
end 

Ce que je besoin est d'avoir toutes mes exceptions uncaught passer au niveau le plus haut et être pris là-bas et ensuite enregistrées par l'enregistrement d'erreur fonction.

J'essaie cela maintenant, mais ce serait génial d'avoir vos suggestions.

0

Vous pouvez modifier le code de la classe Exception dans la partie qui stdout la raison et le backtrace.

N'oubliez pas de vérifier si l'enregistreur peut être nul, l'exception peut être lancée avant (ou pendant) l'enregistreur créé.

Questions connexes