web-dev-qa-db-fra.com

Frais généraux associés à Exception vs Throwable dans Java

Je connais

throw new Exception();

a une surcharge assez importante, car elle crée un stackTrace complet, etc.
Est-ce que

throw new Throwable();

présenter le même problème? Ce comportement est-il hérité ou le lancement d'un Throwable a-t-il une charge plus petite (o no)?

MODIFIER
D'un point de vue analyste, un utilisateur insérant un mot de passe incorrect est une exception à l'ordre d'exécution normal d'un programme. Donc si j'ai:

public Session newSession() {  
  validate_user_and_password();   
}

lancer une exception UserNotValidException semblerait correct d'un point de vue analystes.
Retour de null ou 0 semble juste incorrect si votre code a une assez bonne abstraction. Je voulais juste savoir si je pouvais réellement implémenter cela dans le code, ou si je devais simplement m'en remettre à la théorie.

Il y a une bonne différence entre l'exception du point de vue de la programmation et l'exception du point de vue de l'analyste.

Remarque: J'ai donné un exemple vraiment simple et idiot, ce n'est pas tout à fait mon cas.
Note 2: Je sais que retourner null serait la chose ordinaire, mais je dois avoir correctement résumé et OO code, et, personnellement, je ne vois aucun mal à cela.

27
WhyNotHugo

Throwable crée également une trace de pile lors de sa création. À partir de la documentation Java pour Throwable :

throwable contient un instantané de la pile d'exécution de son thread au moment de sa création.

Ainsi, en termes de surcharge en ce qui concerne la création d'une trace de pile, il ne devrait pas y avoir de différence entre Exception et Throwable.

Si vous utilisez des exceptions pour des "événements exceptionnels" (comme vous devriez l'être), vous ne devriez pas trop vous soucier de la surcharge d'une trace de pile. Un événement exceptionnel se produit rarement lors de l'exécution de code. Les exceptions ne devraient donc pas avoir d'impact significatif sur les performances du code normal.

49
Asaph

Non, vous avez besoin de votre propre sous-classe pour éviter cet effet.

Exception ex = new Exception() {
    @Override public Throwable fillInStackTrace() {
        return this; // and do nothing else
    }
};

Cela crée une instance d'exception qui ne remplira pas la trace de pile (la création d'exceptions délègue à fillInStackTrace pour remplir réellement la trace de pile) et est donc bon marché à créer.

37
akuhn

Avec la compilation JIT, il n'est en fait toujours pas vrai qu'il y ait beaucoup d'entendu à lancer un Exception en Java. Mais lancer un Throwable n'est pas très différent, car vous y obtiendrez également une trace de pile.

Si vous êtes intéressé, il existe un article très intéressant intitulé "Efficient Java exception management in just-in-time compilation" ( link ). Pas une lecture légère, mais assez instructif.

3
danben

Throwable vs. Exception

exception Java

Comme l'a dit @mangoDrunk: "Throwable est la superclasse de l'exception et de l'erreur."

1
YuanYe

Vous ne devez jamais lancer ou attraper Throwable. La portée de l'exception est beaucoup trop grande.

Comme indiqué précédemment, les exceptions ne devraient être utilisées qu'en cas de besoin, c'est-à-dire dans des circonstances exceptionnelles et devraient être spécifiques à la situation qui les a engendrées. Cela mis à part, la capture d'un Throwable implique une multitude d'exceptions, telles que OutOfMemoryException. Une erreur de cette ampleur ne peut pas être récupérée (facilement) et ne doit pas être gérée par le développeur.

1
gpampara

Vous pouvez regarder le code source des deux classes pour voir que Exception ne fait rien au-delà d'exposer les mêmes constructeurs que Throwable =. Toute la viande, et donc les frais généraux, vit dans Throwable.

Même si Exception introduisait une surcharge supplémentaire, ce serait une sur-optimisation claire d'utiliser Throwable à la place. Utilisez le bon outil pour le travail, ne cooptez pas le mauvais outil simplement parce qu'il est plus léger.

1
dimo414

Throwable est la classe parent d'exception. alors Exception class est hérité de Throwable.

1
Muhammad

Java.lang.Exception étend Java.lang.Throwable, c'est donc la même surcharge. De la Javadoc :

La classe Throwable est la superclasse de toutes les erreurs et exceptions dans le langage Java. Seuls les objets qui sont des instances de cette classe (ou l'une de ses sous-classes) sont levés par le Java Virtual Machine ou peut être jeté par l'instruction Java throw. De même, seule cette classe ou l'une de ses sous-classes peut être le type d'argument dans une clause catch.

Les instances de deux sous-classes, Error et Exception, sont classiquement utilisées pour indiquer que des situations exceptionnelles se sont produites. En règle générale, ces instances sont fraîchement créées dans le contexte de la situation exceptionnelle afin d'inclure des informations pertinentes (telles que les données de trace de pile).

0
mangoDrunk