34 votos

¿Por qué utilizar Finalmente en Try ... Catch

Veo que el Finalmente en try .. Catch ejecutará siempre después de alguna de las partes de la ejecución del bloque try catch.

Es diferente a omita la por último, la sección y sólo se ejecuta después de que, fuera del bloque try catch??

Ejemplo 1, Try ... Catch ... Finally ... End Try

    Try
        'Do something
    Catch ex As Exception
        'Handle exception
    Finally
        'Do cleanup
    End Try

Ejemplo 2, Try ... Catch ... End Try ... Hacer la finalmente las cosas fuera

    Try
        'Do something
    Catch ex As Exception
        'Handle exception
    End Try
    'Do cleanup

57voto

Kevin Puntos 57797

Sí, es diferente. Finalmente se ejecutará siempre (salvo caída del programa). Si sale de la función dentro del bloque try catch, o de otro error se produce en el intento o la captura, la que finalmente va a ejecutar. Usted no conseguirá que la funcionalidad no está utilizando la instrucción finally.

11voto

pashute Puntos 312

Código con cuatro botones de radio:

  • De regreso en INTENTAR
  • De regreso en la CAPTURA
  • Tiro en la CAPTURA
  • Acabado de COGER

    private void checkFinally()
    {
        try
        {
            doFinally();
        }
        catch
        {
            Console.WriteLine(" Breaking news: a crash occured. ");
        }
    }
    
    
    private void doFinally()
    {
        Console.WriteLine(" ");
        Console.Write("Here goes: " 
            + (radioReturnInTry.Checked ? "2. Return in try: " 
                    : (radioReturnInCatch.Checked? "3. Retrun in catch: "
                        : (radioThrowInCatch.Checked? "4. Throw in catch: "
                            : "1. Continue in catch: "))) );
        try
        {
            if (radioReturnInTry.Checked)
            {
                Console.Write(" Returning in try. ");
                return;
            }
            Console.Write(" Throwing up in try.  ");
            throw new Exception("check your checkbox.");
        }
        catch (Exception ex)
        {
            Console.Write(" ...caughtcha! ");
            if (radioReturnInCatch.Checked)
            {
                Console.Write("Returning in catch. ");
                return;
            }
            if (radioThrowInCatch.Checked)
            {
                Console.Write(" Throwing up in catch. ");
                throw new Exception("after caught");
            }
        }
        finally { Console.Write(" Finally!!"); }
        Console.WriteLine(" Done!!!"); // before adding checkboxThrowInCatch, 
        // this would never happen (and was marked grey by ReSharper)
    
    
    }
    


Salida:

  • Aquí va: 1. Continuar en la captura: Tirar para arriba en el intento. ...caughtcha! Por fin!! Hecho!!!
  • Aquí va: 2. De regreso en probar: Volver en el intento. Por fin!!
  • Aquí va: 3. Retrun en la captura: Tirar para arriba en el intento. ...caughtcha! Regresando en la captura. Por fin!!
  • Aquí va: 4. Tiro en la captura: Tirar para arriba en el intento. ...caughtcha! Vomitando en la captura. Por fin!! Noticias de última hora: un accidente ocurrido.


Para resumir: Finalmente se tiene el cuidado de dos cosas:

  1. De código que devuelve en la prueba o en la captura.
  2. O Si había una excepción en el intento, Y LANZAR una excepción en la captura,
  3. o, si usted tuvo una excepción en el intento, Y NO COGER esa excepción,

Finalmente, para resumir "FINALMENTE": Finalmente no hace nada especial si usted ha intentado,y

  1. NO VOLVER,
  2. y atrapado en las excepciones durante el juicio, y, a continuación,
  3. NO RETORNO en la captura, y
  4. NO TIRAR o tener código que lanza.

Y por último pero no menos importante (por fin): Si usted tiene una excepción en el código que NO cuajó, el código de la mosca, SIN LLEGAR a LA FINAL.

Espero que esto está claro. (Ahora es a mí...)

Moshe

7voto

rahul Puntos 84185

Finalmente contiene el código que debe ser evaluado en todas las condiciones [de si o no se ha producido una excepción].

No hay manera de salir de un bloque try sin la ejecución de su bloque finally. Si el bloque finally existe, siempre se ejecuta. (Esta declaración es verdadera para todos los intentos y propósitos. Hay una manera de salir de un bloque try sin ejecutar el bloque finally. Si el código se ejecuta en un Sistema.exit(0); desde dentro de un bloque try, se termina la aplicación sin la finalmente la ejecución. Por otro lado, si se desenchufa la máquina durante un bloque try, el que finalmente no se ejecutará).

El uso principal es para la eliminación de objetos. Será útil cuando se desea cerrar de usuario los recursos definidos como archivo , abrió los recursos(db stmts).

Editar

También, finalmente, no se ejecuta después de que un stackoverflow excepción.

4voto

RichieHindle Puntos 98544

La diferencia es que cuando el código de la try bloque lanza una excepción que no es capturado por la catch bloque.

Normalmente un catch bloque de la captura de un tipo específico de excepción, y permita que nada a través de. En ese caso, el finally bloque va a ejecutar.

El finally bloque también se ejecuta si el código de la try block returns.

3voto

scheibk Puntos 1090

Esta es una buena idea cuando se trata con conexiones de base de datos o en cualquier momento que los objetos necesitan ser eliminados. En caso de que algo va mal, mientras que la ejecución de consultas, usted todavía puede cerrar la conexión de forma segura. También ayuda a limpiar el código que el bloque fuera del try/catch/finally bloque no es capaz de acceder.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X