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.
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.
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.
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.
Comme l'a dit @mangoDrunk: "Throwable est la superclasse de l'exception et de l'erreur."
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.
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.
Throwable
est la classe parent d'exception. alors Exception class
est hérité de Throwable
.
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).