S'il y a un tryo-capture avec des blocs de capture multiplié, il y a une certaine façon de réthrow une exception à la clause de capture suivante (non négligente)?
Exemple: p>
try { // some exception can occur here } catch (MyException ex) { // do something specific // rethrow ex to next catch } catch (Exception ex) { // do logging stuff and other things to clean everything up }
5 Réponses :
Vous pouvez essayer plusieurs essais attrayez:
try { } catch(MyException ex) { try { } catch(Exception ex) { } }
Oui, je l'ai aussi eu à l'esprit, mais est-ce un bon style pour nicher le bloc-capture d'essai?
@Frecherxdachs Vous n'êtes pas disposé à utiliser enfin alors je pense que c'est une réponse alternative ou Duncan Jones
Vous pouvez simplement nier votre Bien que je vous inquiéte, c'est ce que vous voulez dire lorsque vous dites " (pas sous-calages) em> "? p> p> essayer code> instructions:
@FRECHERXDACHS Il n'y a rien de mal implicitement avec la nidification des déclarations d'essayer / attraper si vous avez une bonne raison. Dans votre exemple, je dirais que cela a été préférable à un tas d'instance code>.
Mais ensuite, le repère de MyException est alors pris au piège de la capture extérieure et n'est pas vu de plus en plus la trace de la pile qui semble être la question de la question.
Vous avez probablement raison, pourrait être une bonne solution pour cela, mais dans mon opinion, les stations d'emploi, réduisent un peu la lisibilité du code.
public void doStuff() { try { // some exception can occur here } catch (MyException ex){ // do something specific cleanupAfterException(ex); } catch (Exception ex) { cleanupAfterException(ex); } } private void cleanupAfterException(Exception ex) { //Do your thing! } I presume something like this would do?
En principe, ce serait bien, mais j'ai tendance à éviter de tels modèles car il est trop facile pour le GeneralStuff (Ex); code> instruction à omettre ou supprimé par erreur.
@Duncanjones Si par là, vous voulez dire que le nom de la méthode est trop général ou sans script, il est évidemment juste un nom d'espace réservé. Sinon, je ne suis pas tout à fait suivi.
ressemble à une solution propre, mais maintenant, il est peut-être un peu laid de gérer la méthode de nettoyage spécifique
@ Renéjensen Je suis toujours prudent des modèles qui comptent sur les futurs mainteneurs faisant la bonne chose en ajoutant des clauses de capture supplémentaires, etc. Il n'y a rien de mal à ce que vous suggérez, juste une préférence personnelle.
C'est sûrement ce que fonctionnent?
try { doStuff(); } catch ( MyException e ) { doMyExceptionStuff(); doGeneralExceptionStuff(); throw e; } catch ( Exception e ) { doGeneralExceptionStuff(); }
Vous voudrez peut-être essayer quelque chose comme ceci:
try { } catch(Exception ex) { if(ex instanceof MyException) { // Do your specific stuff. } // Handle your normal stuff. }
Oui, j'ai suggéré cela comme une solution possible, mais je n'étais pas sûr, si c'est bon style :)
Je ne vois pas pourquoi pas. Vous vérifiez simplement le type d'exception.
Vous pouvez trouver des sources qui disent que c'est une mauvaise pratique, mais d'après ce que je pouvais trouver, c'est que ce n'est qu'une mauvaise pratique si vous modifiez réellement l'objet que vous vérifiez le type de. Donc, fondamentalement, vous avez une partie de cette classe en dehors de la classe actuelle. La façon dont je comprends votre question cependant, est que dans ce cas, vous ne modifiez rien dans le MyException code>, et je veux juste vérifier le type.
Par curiosité: qu'est-ce qui ne va pas avec la clause
enfin code>?
Rien n'est faux avec enfin !! Cela vous permet d'exécuter du code qui devrait fonctionner avec ou sans l'exception.
@aga Eh bien ... il est déclenché dans tous les cas, pas seulement lorsque des exceptions ont eu lieu.
et ce n'est pas ce que vous voulez :) clair
Oui, j'ai besoin de quelque chose comme enfin-exception: p
D'accord maintenant je comprend. Je devais lire attentivement la question, pas seulement de la vue des yeux de l'oiseau. :)