Frais généraux associés à l'exception vs Throwable en Java
Question
Je sais
throw new Exception();
a une tête assez grande, car il crée une stackTrace complète, etc.
Est-ce que
throw new Throwable();
présente le même problème? Est-ce un comportement hérité, ou ne jetant un Throwable a une plus petite (o pas) les frais généraux?
EDIT D'un analyste point de vue, un utilisateur d'insérer mot de passe erroné est une exception à l'ordre d'exécution normale d'un programme. Donc, si j'ai:
public Session newSession() {
validate_user_and_password();
}
lancer une UserNotValidException sonnerait correcte d'un analystes point de vue.
De retour null
ou 0
sonne incorrect si votre code est assez bonne abstraction. Je voulais juste savoir si je pouvais mettre en œuvre dans votre code, ou si je dois partir juste à la théorie.
Il y a une bonne différence entre exception programmation point de vue et exception analyste point de vue.
Note: J'ai donné un exemple très simple et stupide, ce n'est pas tout à fait mon cas
.
Note 2:. Je sais que le retour null
serait la chose ordinaire, mais je suis tenu d'avoir correctement Abstraite et le code OO, et, personnellement, je ne vois pas de mal à cela
La solution
Throwable
crée également un stacktrace lors de sa création. Des docs java pour Throwable
:
throwable contient un instantané de la pile d'exécution de son fil au moment où il a été créé.
Donc, en termes de frais généraux en ce qui concerne la création d'un stacktrace, il devrait y avoir aucune différence entre Exception
et Throwable
.
Si vous utilisez des exceptions pour les « événements exceptionnels » (comme vous devriez être), alors vous ne devriez pas être trop préoccupé par la surcharge d'un stacktrace. Un événement exceptionnel se produit rarement dans le code en cours d'exécution. Ainsi, les exceptions ne devraient pas affecter les performances du code normal de manière significative.
Autres conseils
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 la pile (la création d'exceptions délégués à fillInStackTrace
pour remplir effectivement la trace de la pile) et est donc pas cher pour créer.
Avec la compilation JIT, il est en fait pas encore le cas où il y a beaucoup de entendu à jeter un Exception
en Java. Mais en jetant un Throwable
est pas très différent, puisque vous obtiendrez une trace de pile là aussi.
Si vous êtes intéressé, il y a un document très intéressant appelé « gestion des exceptions efficace Java dans la compilation juste à temps » ( lien ). Pas lu lumière, mais très instructif.
Vous ne devriez jamais être lancer ou attraper Throwable.
La portée de l'exception est beaucoup trop grande.
Comme indiqué précédemment, les exceptions doivent être utilisées que si nécessaire, à savoir: dans des circonstances exceptionnelles et doivent être spécifiques à la situation qui les ont fait naître. Cela mis à part, attraper un Throwable
implique une foule d'exceptions, comme OutOfMemoryException
. Une erreur de cette ampleur ne peut pas être récupéré à partir (facilement) et ne doit pas être manipulé par le développeur.
Throwable
est classe parente d'exception. si Exception class
est héritée de Throwable
.
Vous pouvez consulter le code source des deux classes pour voir que Exception
ne fait rien au-delà d'exposer les mêmes constructeurs que Throwable
. Toutes les viandes, et par conséquent les frais généraux, vit dans Throwable
.
Même si Exception
a fait introduire une surcharge supplémentaire, il serait clair sur-optimisation pour utiliser Throwable
à la place. Utilisez l'outil pour le travail, ne pas coopter le mauvais outil simplement parce qu'il est plus léger.
java.lang.Exception
étend java.lang.Throwable
, il est donc la même tête. 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'un de ses sous-classes) sont projetés par la machine virtuelle Java ou peuvent être projetés par l'instruction throw Java. De même, seule cette classe ou un de ses sous-classes peuvent être le type d'argument dans une clause catch.
Les cas de deux sous-classes, erreur et exception, sont classiquement utilisés pour indiquer que des situations exceptionnelles se sont produites. En règle générale, ces cas sont fraîchement créés dans le cadre de la situation exceptionnelle afin d'inclure des informations pertinentes (telles que les données de trace de la pile).