2010-08-19 19 views
24

Recientemente me encontré con un código escrito por un programador en la que tuvo un comunicado intento de captura dentro de una captura!la gestión de excepciones intento de captura en el interior de captura

Por favor, perdona mi incapacidad para pegar el código real, pero lo que hizo fue algo similar a esto

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

Personalmente, creo que es uno de los más pobres de código que he visto nunca! En una escala del 1 al 10 ... ¿Qué tan pronto usted piensa que debería ir y darle un pedazo de mi mente? ¿O estoy reaccionando demasiado?

EDIT: Lo que en realidad está haciendo es que en la trampa, está realizando algunas otras operaciones que pueden/deben hacerse cuando falla la prueba inicial. Mi problema es tener un código limpio y mantenibilidad. Delegando la excepción de la primera captura a una función diferente o llamando a la función estaría bien, pero la adición de más código que puede o no puede lanzar una excepción en la primera captura, es lo que sentía no era bueno. Intento evitar múltiples declaraciones "if-loop" apiladas, esto me parece igualmente malo.

  • IvarD
+8

Esto es bastante común, por lo que sin ver lo que realmente hace el código - no hay nada inherentemente malo en esto. – nos

+5

Prefiero preguntarle qué estaba tratando de lograr. –

Respuesta

107

¿Por qué es tan malo? No es diferente conceptualmente de:

void TrySomething() { 
    try { 


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

void HandleTrySomethingFailure() { 
    try { 

    } catch (IndexOutOfRangeException) { 

    } 
} 

Antes de ir allí y le das un pedazo de su cerebro (probar el lóbulo parietal, que es particularmente ofensivo), lo que es exactamente lo que va a decir a él? ¿Cómo responderás al proverbial "¿por qué?"

Lo que es aún más irónico es que cuando los inlines jitter este código, se verá exactamente igual que tu ejemplo.

-Oisin

+16

Estoy totalmente de acuerdo. Si sientes que hay algo mal con su código y estás dispuesto a confrontarlo, será mejor que tengas una excelente alternativa lista para el presente. – ChrisNel52

11

Sin saber lo que hace el código es imposible de decir. Pero no es inusual para hacer esto.

p. Ej. si tiene que borrar recursos mientras maneja excepciones, ese código de limpieza en sí mismo puede tener la capacidad de lanzar excepciones.

17

He aquí un caso:

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

Se trata de lo mismo que dijo @ x0n. Es posible que necesite manejar una excepción mientras trata de cerrar recursos o mientras intenta resolver una situación provocada por otra excepción.

Cuestiones relacionadas