web-dev-qa-db-fra.com

Gestion des exceptions try catch inside catch

J'ai récemment rencontré du code écrit par un collègue programmeur dans lequel il avait une instruction try-catch dans un catch!

Veuillez pardonner mon incapacité à coller le code réel, mais ce qu'il a fait était quelque chose de similaire à ceci:

try
{
 //ABC Operation
}
catch (ArgumentException ae)
{
   try
   {
      //XYZ Operation
   }
   catch (IndexOutOfRangeException ioe)
   {
      //Something
   }
}

Je pense personnellement que c'est l'un des codes les plus pauvres que j'ai jamais vu! Sur une échelle de 1 à 10, dans combien de temps pensez-vous que je devrais aller lui donner un coup d'œil, ou suis-je en train de réagir de manière excessive?

EDIT: Ce qu'il fait réellement dans le catch, il effectue certaines opérations qui peuvent/devraient être effectuées lorsque l'essai initial échoue. Mon problème est d'avoir un code propre et une maintenabilité. Déléguer l'exception de la première capture à une fonction différente ou à la fonction appelante serait OK, mais ajouter plus de code qui peut ou non lancer une exception dans la première capture, est ce que je ressentais n'était pas bon. J'essaie d'éviter plusieurs instructions "if-loop" empilées, j'ai trouvé cela tout aussi mauvais.

36
topgun_ivard

Pourquoi est-ce mauvais? Ce n'est pas différent conceptuellement que:

void TrySomething() {
   try {


   } catch (ArgumentException) {
        HandleTrySomethingFailure();
   }
}

void HandleTrySomethingFailure() {
    try {

    } catch (IndexOutOfRangeException) {

    }
}

Avant de vous rendre là-bas et de lui donner un morceau de votre cerveau (essayez le lobe pariétal, c'est particulièrement offensant), qu'allez-vous lui dire exactement? Comment allez-vous répondre au proverbe "pourquoi?"

Ce qui est encore plus ironique, c'est que lorsque la gigue insère ce code, il ressemblera exactement à votre exemple.

-Oisine

138
x0n

Voici un cas:

try{
    //Dangerous Operation
} catch (AnyException ae) {
    try {
        //Do rollback which can fail
    } catch (RollbackFailedException rfe) {
        //Log that
    }
} finally {
    try {
        //close connection but it may fail too
    } catch (IOException ioe) {
        //Log that
    }
}

C'est à peu près la même chose que @ x0n l'a dit. Vous devrez peut-être gérer l'exception tout en essayant de fermer les ressources ou pendant que vous essayez de résoudre une situation provoquée par une autre exception.

22
Colin Hebert

Sans savoir ce que fait le code, il est impossible de le dire. Mais ce n'est pas inhabituel pour ce faire.

par exemple. si vous devez effacer des ressources tout en gérant des exceptions, ce code de nettoyage lui-même peut avoir la capacité de lever des exceptions.

18
Brian Agnew