2010-08-19 7 views
24

Je suis récemment tombé sur un code écrit par un collègue programmeur dans lequel il avait une instruction try catch dans un catch!Gestion des exceptions try catch catch inside

S'il vous plaît pardonnez mon incapacité à coller le code réel, mais ce qu'il a fait était quelque chose de semblable à ce

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

Je me sens personnellement qu'il est l'un des plus pauvres du code que j'ai jamais vu! Sur une échelle de 1 à 10 ... dans combien de temps pensez-vous que je devrais y aller et lui donner une partie de mon esprit? Ou est-ce que je réagis trop?

EDIT: Ce qu'il fait en réalité, c'est que dans la capture, il effectue d'autres opérations qui peuvent/devraient être faites 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 d'appel serait OK, mais en ajoutant plus de code qui peut ou non lancer une exception dans la première capture, c'est ce que je trouvais mauvais. J'essaie d'éviter plusieurs "if-loop" empilés, j'ai trouvé cela aussi mauvais.

  • IvarD
+8

Ceci est assez commun, donc sans voir ce que le code fait réellement - il n'y a rien intrinsèquement faux avec cela. – nos

+5

Je préférerais lui demander ce qu'il essayait d'accomplir. –

Répondre

107

Pourquoi est-ce mauvais? Il est pas différent sur le plan conceptuel que:

void TrySomething() { 
    try { 


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

void HandleTrySomethingFailure() { 
    try { 

    } catch (IndexOutOfRangeException) { 

    } 
} 

Avant d'aller là-bas et lui donner un morceau de votre cerveau (essayez le lobe pariétal, il est particulièrement choquant), qu'est-ce que vous allez exactement à lui dire? Comment allez-vous répondre à la proverbiale "pourquoi?" Ce qui est encore plus ironique, c'est que lorsque la gigue insère ce code, il ressemble exactement à votre exemple.

-Oisin

+16

Je suis totalement d'accord. Si vous pensez qu'il y a quelque chose qui ne va pas dans son code et que vous êtes prêt à le confronter, il vaut mieux avoir une excellente alternative prête à présenter. – ChrisNel52

11

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

par exemple. Si vous devez supprimer des ressources tout en gérant des exceptions, ce code d'effacement lui-même peut avoir la capacité de lancer des exceptions.

17

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

Il est de la même chose que @ x0n dit. Vous devrez peut-être gérer une exception en essayant de fermer des ressources ou pendant que vous essayez de résoudre une situation déclenchée par une autre exception.