2011-08-26 6 views
12

¿Alguno de estos es riesgoso? ¿Es uno mejor? ¿O es una de esas cosas que imprimes y lanzas un dardo para decidir?¿Retorno en prueba y captura versus devolución finalmente?

quiero hacer esto ahora que entiendo cómo finalmente funciona:

try { 
    stuff that changes something... 
} 
catch (System.Exception ex) { 
    something.worked = false; 
    something.err = ex.Message; 
} 
finally { 
    stuff.close(); 
    return something; 
} 

pero he visto:

try { 
    stuff that changes something... 
    return something; 
} 
catch (System.Exception ex) { 
    something.worked = false; 
    something.err = ex.Message; 
    return something; 
} 
finally { 
    stuff.close(); 
} 
+1

@Dlev - Excepto que el primero no es válido C# por lo que no se puede hacer. Entonces, ¿cómo puede ser preferible? Esta pregunta realmente debería hacerse de nuevo, una en la que cualquier código sea realmente válido, de lo contrario sería inútil. –

+0

@Ramhound Vaya, quise decir que el primero no es legal C#. El último es realmente válido sintácticamente. – dlev

Respuesta

17

No se puede return de finally. Obtendrá error del compilador:

Control cannot leave the body of a finally clause


Si clase de destino implementa IDisposable entonces yo haría a continuación:

using (stuff s = new stuff()) 
{ 
    return stuff; 
} 

o

using (stuff s = new stuff()) 
{ 
    try 
    { 
     // do stuff 
     return stuff; 
    } 
    catch (Exception ex) 
    { 
     // do logging or another stuff 
     return something; 
    } 
} 

llamarán Dispose() para usted si esa voluntad ser requerido/posible.

+0

¡Doh! Intenta compilar antes de preguntar la próxima vez, Self! Tiene sentido que el control no puede dejar un final ya que finalmente es tan único en la exigente atención. – ChuckNeuros

+2

@ user540903: Bueno, sí, deberías haber compilado. Pero no te rindas demasiado mal; hay idiomas en los que el retorno desde el final es legal, y esos lenguajes tienen una semántica de flujo de control bastante extraña como resultado. Es una pregunta razonable en general, solo que no para C#. –

+0

@Eric I'm pretty Java es uno de esos idiomas. Por lo que recuerdo, el 'return' más reciente sobrescribe los anteriores, así que' try {throw new BlahException(); } catch {return 1; } finally {return 2; } 'en realidad devuelve un' 2' a la persona que llama. – dlev

17

Personalmente me gustaría hacer ni usaría y


try { 
    stuff that changes something... 
} 
catch (System.Exception ex) { 
    something.worked = false; 
    something.err = ex.Message; 
} 
finally { 
    stuff.close();  
} 
return something; 

También en la declaración finally, y comprueba que es necesario cerrar/Eliminar los objetos, ya que podría nunca han sido abiertos/set si han fallado.

también ver aquí Is it bad practice to return from within a try catch finally block?

+1

Estoy de acuerdo con esto, ya que abatishchev dice que no puede regresar por fin, no creo que deba tener una devolución en una trampa. Si tienes una captura de prueba y no vuelves a tirar, quieres que regrese en cualquier dirección y si vuelves a tirar, nunca volverá. De cualquier manera, solo necesita 1 declaración de devolución no 2 –

+1

que regresa desde el try/catch/finally no se considera "programación estructurada". Estoy de acuerdo con Tim y Ben. –

0

No hay riesgo en el segundo enfoque. Pero le permite devolver diferentes valores en caso de excepciones.

+1

Lo mismo ocurre cuando se devuelve una variable y se establece en valores diferentes en los bloques try y catch, pero solo se obtiene 1 retorno fuera del bloque try/catach completo. –

+0

devolver el valor a de una variable también le permitirá devolver diferentes valores en el caso de excepciones. –

Cuestiones relacionadas