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

Était-ce utile?

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.

Exception Throwable par rapport à

Java Exception

Comme @mangoDrunk dit: "Throwable est la superclasse d'erreur et d'exception."

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).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top