2009-12-17 11 views
0

Je souhaite la concevoir de manière à ce que chaque fois qu'une de mes exceptions personnalisées est lancée, elle imprime automatiquement la pile dans un fichier. Existe-t-il une méthode que je peux remplacer pour accomplir ceci? Faire cela aiderait à réduire une quantité notable de code dans mon projet.Impression d'exception Java personnalisée lorsqu'elle est lancée

Répondre

3

La pile de données est disponible dès que vous appelez le constructeur de votre exception. Vous ne pouvez pas réagir à l'événement d'être lancé, mais vous pouvez écrire la pile dans votre constructeur. Si vous avez une classe d'exception commune qui est la base de toutes vos exceptions personnalisées, vous pouvez faire tout cela dans son constructeur.

+1

+1 pour distinction nuancée. Si vous instanciez avec empressement des exceptions et ne les jetez pas toujours, ou si vous les instanciez dans une pile différente de celle où l'exception est levée, cela causera un problème. Sinon, ça devrait aller. –

0

Je ne peux pas vous aider à imprimer une trace de pile lorsqu'une exception est levée. Mais il est assez facile à faire lorsque l'exception est construite - Il suffit d'inclure le printStackTrace() dans le constructeur de votre exception personnalisée.

+0

Cela ne nécessite-t-il pas de rediriger stderr vers le fichier? –

+0

Non. Il existe une méthode exc.printStackTrace (PrintWriter pw). Vous pouvez passer cela quel que soit l'auteur que vous aimez. –

3

Vous pouvez faire hériter vos exceptions personnalisées de RuntimeException, puis définir le UncaughtExceptionHandler sur les threads concernés pour rechercher vos exceptions et les gérer comme vous le souhaitez.

+0

Comme son nom l'indique, UncaughtExceptionHandles intercepte uniquement les exceptions non affectées. Ce n'est pas un remplacement pour les blocs de prises bien placés. – tangens

1

Existe-t-il une méthode que je peux remplacer pour accomplir cela?

Oui, la méthode printStacktrace().

Vous pouvez créer une classe de base pour vos exceptions et les appeler à une impression «interne» qui serait redéfinie dans votre fichier.

Vous pouvez utiliser un Logger et avoir ce enregistreur spécifique pointant vers le fichier que vous désirez (et le modifier, le désactiver, le réactiver, etc. lorsque vous avez besoin)

Quelque chose le long des lignes:

class MyStackTrace extends Throwable { 
    public void printStacktrace() { 
     super.printStracTrace(); 
     internalPrint(); 
    } 
    private void internalPrint() { 
     StringWriter sw = new StringWriter(); 
     printStackTrace(sw); 
     Logger logger = Logger.getLogger("exceptions"); 
     logger.warning(sw.toString()); 
    } 
} 
0

En général, ce n'est pas une bonne idée de se connecter à chaque création d'exception. Le receveur devrait vraiment décider quelle est la meilleure façon de gérer une exception. La substitution de la méthode en exception et la consignation dans un fichier annulent également le contrat général autour de l'exception. Sur une note de côté, vous pouvez découvrir un problème de performance horrible lié à la journalisation à un stade ultérieur. Étant donné que le dépassement se produit dans un endroit central, vous aurez du mal à y remédier.

Si vous souhaitez toujours vous connecter tout en lançant l'exception, la meilleure solution consiste à utiliser/créer une classe d'utilité telle que Throwables. Appelez le code Throwables.logAndThrow (new CustomerException (...)), même ligne de code mais flexible sur le long terme. logAndThrow pourrait être aussi simple que, en utilisant la technique de l'enregistreur de l'affiche précédente:

logAndThrow public static void (Throwable t) { logger.warning (t); lancer t; }