6
votes

"Rethrow" à la clause de capture suivante

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
}


6 commentaires

Par curiosité: qu'est-ce qui ne va pas avec la clause enfin ?


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


5 Réponses :


0
votes

Vous pouvez essayer plusieurs essais attrayez:

try {

} catch(MyException ex) {
    try {

    } catch(Exception ex) {

    }
}


2 commentaires

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



1
votes

Vous pouvez simplement nier votre essayer instructions: xxx

Bien que je vous inquiéte, c'est ce que vous voulez dire lorsque vous dites " (pas sous-calages) "?


3 commentaires

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


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.



4
votes
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?

4 commentaires

En principe, ce serait bien, mais j'ai tendance à éviter de tels modèles car il est trop facile pour le GeneralStuff (Ex); 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.



0
votes

C'est sûrement ce que fonctionnent?

try {
    doStuff();
} catch ( MyException e ) {
    doMyExceptionStuff();
    doGeneralExceptionStuff();
    throw e;
} catch ( Exception e ) {
    doGeneralExceptionStuff();
}


0 commentaires

4
votes

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


3 commentaires

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 , et je veux juste vérifier le type.