2010-12-08 12 views
6

He intentado atrapar finalmente el bloqueo y, si se produce alguna excepción, volveré del bloque catch, por lo que finalmente se ejecutará el bloque, de ser así, ¿cuándo? Antes de regresar o después de regresar?Al regresar de la función a través del bloque catch, ¿qué sucede con el bloqueo final?

¿Es esta la práctica correcta?

try 
{ 
// do something 
} 

catch (Exception) 
{  
    return false; 
} 
finally 
{ 
    if (connection.State == ConnectionState.Open) connection.Close(); 
} 
+3

Puede averiguar si establece un punto de interrupción en ambas líneas en la captura y en el final? – RvdK

+0

Tricky one ... ¡Lo sé! - Podrías ejecutarlo y ver qué pasa. –

Respuesta

6

Ejecutará el bloque "finalmente" después del retorno. "Por último" se utiliza para un poco de práctica, como conexión de base estrecha (siempre necesita ser hecho)

+0

Uno pensaría que finalmente no es necesario si usas 'using'. – Dialecticus

+0

usando solo se puede aplicar a instancias que implementen la interfaz IDisposeable y el compilador transformará el bloque de uso en un intento adecuado ... finalmente bloquear. Editar: reemplazado ICloneable con IDisposable – Dennis

+0

@Dialectus: esa es una suposición razonable, dado que el uso es azúcar sintáctica que hace que el compilador llame a 'Dispose' con un bloque 'finally'. –

2

Finalmente el bloqueo siempre se ejecuta. En su caso, se ejecuta antes de su declaración de devolución.

+0

Creo que finalmente se ejecuta después de declaración de devolución, pero antes de la ejecución vuelve a la función de llamada. regresar -> finalmente -> regresar. – Dialecticus

+0

Debbuger va a la instrucción return primero y al lado del bloque finally. Pero el programa va primero al bloque final y luego abandona el método. Así que puedo decir razonablemente que el bloque finally se ejecuta antes de la declaración de retorno (abandona el método). – Nicolas

+5

La especificación del lenguaje C# es bastante clara en el orden en que suceden las cosas: 1) se evalúa la expresión en la declaración 'return', 2) se ejecuta el bloque' finally' (esto se repite para cualquier encerramiento 'try-finally' bloques), 3) el control se devuelve a la persona que llama. Entonces, 'finally' se ejecuta * después * de que se evalúa la declaración' return', pero el control * before * se devuelve a la persona que llama. –

1

Usted puede tratar con su auto

private bool test() 
    { 
     try 
     { 
      int i = 0; 
      int u = 10/i; 
     } 

     catch (Exception) 
     { 
      return false; 
     } 
     finally 
     { 

     } 
     return true; 
    } 

por lo que es una excepción divideby cero. Cuando ejecuta este código, finalmente se ejecutará y después se ejecutará el retorno.

es algo así como Runtime el resultado devuelto en caso de bloqueo final!

0

Un bloque finally siempre se ejecutará antes de que el código salga de un bloque try-catch-finally (cualquier condición como ThreadAbortException que impida que el bloque finally se ejecute evitará que el código salga del bloque try-catch-finally).

Cuestiones relacionadas