Comment éviter de nombreux blocs try catch en java
Je suis très nouveau pour java et l'idée des blocs try catch pour gérer les exceptions.
Ce à peu près ce que je suis finir avec, et il y a tout simplement être une meilleure façon:
try {
JSONObject jsonObject = new JSONObject(jsonString);
int aCount = jsonObject.getInt("acount");
String devTok = jsonObject.getString("dt");
String qURL = jsonObject.getString("qu");
try {
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
Key qKey = KeyFactory.createKey("qu", qURL);
int dsACount = (Integer) datastore.get(qKey).getProperty(kLastKnownANumber);
//..etc.. more try catch blocks needed
} catch (EntityNotFoundException e) {
e.printStackTrace();
}
} catch (com.google.appengine.repackaged.org.json.JSONException e) {
e.printStackTrace();
}
Il y a plus de blocs try catch embarqués dans la même manière, de sorte qu'à la fin, il y a juste un morceau de blocs catch. Sinon, comment devrait exceptions être manipulés, Eclipse me demande mon surround avec un bloc try catch ou "Ajouter jette déclaration".
Parfois, j'ai envie d'attraper certaines exceptions, par exemple si il ne peut pas trouver une entité, je veux imprimer quelque chose comme "Entité non trouvé", et si la chaîne JSON ne peut pas être analysé dans un objet, je veux imprimer quelque chose comme "ne Peut pas analyser JSON".
(Je suis habitué à objective-c, où le délégué sont les méthodes de l'échec, ou la méthode renvoie null et que vous avez passé un pointeur vers un [pointeur] un NSError objet, qui ont été "rempli", Est-il un endroit pour apprendre à propos de try-catch?)
- Wow les gens à répondre à java questions rapides 🙂
Vous devez vous connecter pour publier un commentaire.
Si tout ce que vous faites est de les attraper et de l'impression, la trace de la pile quel que soit le type d'exception, vous pouvez simplement placer le code dans un grand bloc try/catch. Pour enregistrer beaucoup de "captures", vous pouvez vous rattraper
java.lang.Throwable
qui est l'interface que toutes les exceptions mettre en œuvre. Si non, vous pouvez avoir une prise pour chaque type de vérifié exception le code que vous appelez jette, et les traiter spécifiquement.Eclipse garde en vous demandant de le faire parce que Java code ne compilera pas si l'objet d'exceptions ne sont pas pris, ou ayant déclaré être lancée par l'appelant.
+Ajout de ce commentaire à la réponse (Merci, Paul Tomblin):
Dans la production d'applications de qualité, vous seriez de journalisation de la trace, l'ajout d'un peu de logique où vous êtes la manipulation de l'exception dans le droit chemin, en prenant un autre flux, et/ou la réutilisation en l'enveloppant dans une autre exception et de le jeter, etc. Tout dépend du problème que vous essayez de résoudre.
L'idée de la gestion des exceptions est que vous pouvez gérer les erreurs à points dans votre flux de programme où vous pouvez traiter avec eux de manière significative. Plutôt que de vérifier chaque valeur renvoyée de la fonction comme dans C, où la plupart du temps vous ne pouvez pas faire quelque chose de sensé autre que le passage de l'erreur plus haut, vous installez un bloc try/catch au sensible points dans votre programme:
En gros, quand il y a un point où vous peut réagir de façon significative à une erreur, puis rattraper cette erreur, et passer tout le reste. De cette façon, la gestion des erreurs n'est invoquée lorsqu'il est plausible de la récupération de l'erreur.
Par exemple, dans le pire des cas si tout erreur s'arrête votre programme de s'exécuter de façon significative, alors vous pourriez presque pas attraper quelque chose à tous et de laisser le système d'exploitation de gérer la situation (bien, peut-être un seul try/catch pour produire un sympathique message d'erreur).
Exemple (en C++, désolé, j'ai pas de type de Java à l'aveugle):
Dans cet exemple, on peut essayer de traiter une image et l'échec de certains anticipable raisons (manque de mémoire, ou de l'échec à la lecture de l'image). Dans ce cas, nous venons de rentrer sans faire le travail et de laisser le programme continuer normalement. Toutes les autres erreurs sont propagées jusqu'à un point plus élevé. Plus important encore, nous ne pas besoin de salir la réelle fonction de traitement d'image avec des contrôles d'erreur et les réponses tout le temps, il suffit, pour que tout le code de là à jeter l'un de nos deux bonnes exceptions et ne pas s'inquiéter davantage.
Moral: Si vous avez des blocs try/catch absolument partout, vous le faites mal.
Je sais qu'il y a beaucoup de réponses ici, et ils font un bon travail de couverture de la structure de blocs try/catch. Cependant, je pense que l'une des choses qui vous dérange est l'important... indentation de code et de croissance (... parce que je sais que c'est pas le retrait ou la quantité de code, mais la complexité implicite par elle d'emballage et de déplacement et la croissance de plus en plus long entre l'ouverture de l'essayer et en joignant les attraper, et je ne peux pas mettre un mot pour que la crainte).
Le moyen de contourner ce problème est de refactoriser en fonctions distinctes de bits dans le code. Je sais que c'est une solution simpliste, mais c'est un bon moyen d'isoler les différentes tâches et de garder la gestion des erreurs assez locale du code qui nécessite sans rembourrage choses verticalement et horizontalement avec imbriqués les blocs try/catch.
Vous pouvez faire ces méthodes privé qu'ils sont destinés à un usage interne uniquement, sans doute.
Vous pouvez prendre plusieurs exceptions dans le même essayez par exemple
Aussi, en déclarant l'Exception que
throws
dans vos signatures de méthode, vous pouvez passer l'Exception de la pile.Si vous êtes en train de faire quelque chose comme ceci:
Vous pouvez faire tout en un seul
try
-bloc:Vous pouvez également proposer à un bloc catch si vous êtes juste l'impression de l'exception:
Mais ce n'est pas si vous voulez faire quelque chose de plus, même si
e1
est jeté, comme:Le dernier exemple ne peuvent pas être écrits plus courts.
Si vous avez un bloc de code dans lequel plus d'un type d'exception peut être levée, vous pouvez déclarer les deux blocs catch:
Alternativement, si vous n'avez pas de soins sur le type exact de l'exception, vous pouvez avoir onyl un bloc catch qui attrape
Exception
(ou peut-êtreThrowable
; je ne me souviens pas exactement ce que la super-classe d'exceptions en Java).Un autre point que je vais faire maintenant, c'est que vous pourriez ne pas avoir la plupart du code modulaire. Rappelez-vous, le code qui fait une chose bien fait pour de bon, code modulaire. Si vous trouvez que vous avez beaucoup de imbriquée noir (si les blocs try/catch, si/d'autre blocs, etc.) vous voudrez peut-être vérifier si le code peut être extraite dans sa propre méthode. Cela peut également rendre votre code plus belle lorsque de nombreuses exceptions qui doivent être gérés.
Tout d'abord, d'un point de vue de la conception, de capture et d'impression des exceptions n'est pas une bonne chose. Quelque chose allait mal, et que votre code ne cesse de passe de la même manière que si elle va de droite. Qui n'est généralement pas correct. Donc: il se peut que votre méthode doit jeter ces exceptions au lieu de leur capture. Peut-être que l'appelant est en mesure de décider de ce qui se passe si quelque chose tombe en panne comme ça.
Mais sinon, le seul conseil que je peux offrir pour nettoyer la façon dont le code ressemble, du point de vue syntaxique, est de vous dire que vous pouvez écrire:
Vous pouvez également prendre pour une large classe d'exception comme
Exception
et il suffit d'écrire un bloc catch, mais c'est une mauvaise conception. Dans Java 7, vous serez en mesure de prendre plusieurs types d'exception dans un bloc.throw
interrompt l'exécution à droite. Ne pas attraper et re-lancer des exceptions, il est redondant. Si ce n'est pas attrapé, il suffit de se propager hors de la méthode. Si c'est approprié ou non est une autre question, mais c'est la façon dont vous le faites.Vous devez utiliser les blocs try/catch si vous avez un moyen de le récupérer à partir de l'exception, par exemple, si vous voulez vérifier si une chaîne est un entier valide, vous pouvez écrire une méthode (c'est une lame de méthode, mais juste pour montrer l'idée):
Si vous n'avez pas de moyen de récupérer de l'exception et tout ce que vous faire est d'imprimer la trace de la pile, il est proposé d'ajouter jette déclaration (comme eclipse proposer) à la méthode, et l'appelant de gérer l'exception (ou de le jeter à son appelant).
Si vous souhaitez gérer des exceptions, et de jeter quelques autres, vous pouvez le faire aussi bien.
J'aime faire l'appel derrière une méthode statique, juste pour le garder plus propre. Par exemple, voici mon Jeu réduit Valeur Json appel.
...et puis j'ignore les valeurs de retour, parce que je suis mauvais.
Quelque part ou autre j'en ai un similaire méthode Get, qui retourne null en cas d'échec. Vous obtenez l'idée.
Vous avez deux code de base de style de choix ici (qui n'impliquent pas de changement de méthode de signatures)
Method1: Mettre le tout dans une
try catch
et ont plusieurs blocs catch, comme ceci:Méthode 2: Casser votre code en sections qui ont chacune une
catch
, comme ceci:La méthode 2 est celui qui est recommandé, comme il est évident que les lignes sont en jetant des exceptions et généralement les segments du code dans les blocs de traitement.
return
outhrow
)