Essayer/Multi-Catch vs Catch Unique
Tout en ajoutant un bloc try/catch dans Eclipse, il m'a donné la possibilité de "Surround avec try/multi-catch" ou "Surround avec try/catch."
C'est le try/multi-catch:
try {
save.load(new FileInputStream(file.getAbsolutePath()));
}
catch (FileNotFoundException | IOException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
C'est le seul try/catch:
try {
save.load(new FileInputStream(file.getAbsolutePath()));
}
catch (FileNotFoundException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
Quels sont les avantages et les répercussions de l'utilisation de l'un ou de l'autre? Si je suis correct, le premier exemple va exécuter le bloc catch lorsque l'une des exceptions sont levées, et de produire le MÊME pêcher, tandis que le deuxième exemple lancer une capture basée sur l'exception, tout en permettant de séparer les blocs catch.
Est-il autre chose que je devrais savoir à ce sujet? Je n'ai jamais utilisé auparavant, et ne sais pas si elles valent la peine de l'utiliser.
- Augmentation ou diminution de la lisibilité!
- Si vous êtes en train de faire la même chose dans les deux cas, l'utilisation de multi-prises. Si non, alors non.
- Notez qu'un
FileNotFoundException
est unIOException
. - J'ai eu l'Éclipse de l'auto-complétion pour moi, pour l'exemple. C'est corrigé dans mon vrai code.
- Je suis avec vous, ne vous inquiétez pas. J'ai vu l'Éclipse de générer beaucoup plus idiot des choses, croyez-moi.
- Je pense que votre deuxième bloc de code est également un try/multi-catch, mais vous avez dit "C'est le seul try/catch:"
Vous devez vous connecter pour publier un commentaire.
tl;dr Mutlicatch gère des choses raison, à lui seul, plusieurs blocs catch sont plus souples et plus agréable à l'exploitation. Les deux techniques peuvent être combinées.
Si vous avez une instruction try qui peut jeter beaucoup de différents types d'exception, vous aurez besoin de la plusieurs blocs catch. C'est un peu plus de code, mais offre beaucoup plus de flexibilité.
Par exemple, si vous travaillez avec des sockets, une exception socketexception peut être pris avec rien de plus qu'une reconnexion et/ou un message d'erreur (comme quelque chose d'aussi simple qu'un par mégarde débranché le câble peut provoquer ce)
Si une exception de pointeur null(même si c'est pas cochée) est pris, vous allez avoir à écrire dans un journal et faire un atterrissage d'urgence ici, de nettoyage jusqu'à ce que vous pouvez, et de retour en arrière un peu codewise, peut-être.
En outre, cela peut subdiviser, où différents types de "commun" des exceptions peuvent provoquer des différentes mesures à prendre(par exemple une connexion perdu vs nom n'est pas résolu avoir des conséquences différentes pour l'utilisateur final sur la première tentative de connexion) et les différents "lourde", les exceptions étant traitées de différentes façons.
Alors que vous pourriez en avoir un (de plusieurs type d'exception) bloc catch, c'était soit uniquement prendre des mesures similaires pour toutes les exceptions (présentation d'une exception de pointeur null à un utilisateur de la même manière comme une condition fondée sur l'un câble débranché) ou qui nécessitent
if e instanceof FooException
blocs qui peut nuire à la lisibilité.Vous pouvez aussi combiner les deux, multicatching tous les "communs" des exceptions dans une nouvelle tentative et gentil message et tous graves les exceptions dans un forcé de nettoyage et d'arrêt
Vous ne voulez pas stacktraces pour déclenché les câbles, et vous ne voulez pas vous brosser les objets disparus.
- Ce un choix de la chose. Vous voulez équilibrer la lisibilité, la portabilité, la facilité de maintenance et également le traitement des différents exceptions différemment.
Alors l'équilibre de l'utiliser ... Si toutes vos captures d'utiliser le même bloc de manutention ensuite utiliser la première forme, parce que c'est juste un bloc de code et vous n'êtes pas de vous répéter, encore et encore. Le compilateur peut optimiser les choses un peu pour vous.
D'autre part l'utilisation de la deuxième forme si vous êtes le traitement de chaque exception différemment.
C'est un peu un vaste question et la réponse dépend de vos objectifs.
Je crois que votre premier extrait de code ne sont applicables si votre JDK est le JDK Java 7. tandis que le second extrait continueront à fonctionner dans le JDK 7 et ci-dessous.
Si vous avez une ligne de code qu'il est possible de lancer différents types d'exception et vous souhaitez le faire d'une manière similaire, Multicatch ajustement sera parfait pour vous car il économise plusieurs lignes de code.
toutefois, si vous avez une ligne de code qui permettra de lancer plusieurs exceptions, et que vous souhaitez gérer ces exceptions individuellement, une seule exception de catch va s'adapter à vous plus.
Si vous voulez faire la même chose pour toutes les exceptions, essayez-multi catch et try-catch sont les mêmes, sauf que le premier est plus court. Tous les programmeurs sont paresseux.
Lorsque vous voulez faire autre chose pour les différentes exceptions:
Essayez-multi catch n'est pas le bon choix.
Noter que le type de
e
est le plus proche de la commune supertype deAException
etBException
.Look, le réelle utilitaire de try-catch structures, vous pouvez appliquer une gestion d'erreur spécifique de la fonction à une exception spécifique. Dans votre cas, il n'apparaît pas que vous voulez à autre chose, autre qu'une trace de la pile pour être imprimé. Si j'ai, par exemple, voulait la fenêtre pour la fermer si un FileIOException a été jeté, et je voulais simplement un message d'erreur s'affiche si une exception se produit, alors il serait utile de disposer de plusieurs blocs try-catch comme vous l'avez écrit dans le deuxième bloc de code. Dans cette application, cependant, vous pourriez juste voulez attraper comme ceci:
Et qui permettra d'imprimer un strack trace de TOUTES les exceptions. 🙂