¿Cómo funciona el try catch por último bloque de trabajo?

En C#, ¿cómo un try catch, por último bloque de trabajo?

Así que si hay una excepción, yo sé que va a saltar al bloque catch y, a continuación, saltar a la del bloque finally.

Pero, ¿y si no hay ningún error, el bloque catch no consigue correr, pero no el bloque finally se consigue correr entonces?

  • Yo estoy a favor de la experimentación, pero que no necesariamente a decir lo que el lenguaje de garantías. Hay varias cosas que usted puede «descubrir» por la experimentación que sería malo para confiar.
  • Estoy hablando en términos generales, no se trata de su propia sugerencia (el enlace), pero me refiero a que la comprobación de cómo try/catch/finally obras en C# es algo que usted puede descubrir sólo con este código: try { } catch{ } finally { Trace.WriteLine("I'm here!"); } por ejemplo 🙂
  • Pero ese es mi punto – que muestra lo que se hace en este caso en particular – pero no nos dice nada acerca de lo que sucede si (decir) que la devolución dentro de los try bloque. Sí, la experimentación es buena pero me gustaría por lo general, prefieren confiar en una especificación en la que sea posible.
  • 100% de acuerdo. Yo siempre prefiero leer una página de documentación y saber exactamente cómo se comporta algún lenguaje o función API. Pero me refiero a que no iba a hacer una pregunta en un foro sin leer el llamado de la documentación o al menos tratando de mí mismo un código de ejemplo. Pero, de nuevo, 100% de acuerdo, la especificación > prueba-error.
InformationsquelleAutor omega | 2012-11-24

5 Kommentare

  1. 45

    Sí, el bloque finally se ejecuta si hay una excepción o no.

    Intentar 
    [ tryStatements ] 
    [ Exit Try ] 
    [ Catch [ excepción [ tipo ] ] [ Cuando la expresión ] 
    [ catchStatements ] 
    [ Exit Try ] ] 
    [ Catch ... ] 
    [ Finalmente 
    [ finallyStatements ] ] --EJECUTAR SIEMPRE 
    End Try 
    

    Ver: http://msdn.microsoft.com/en-us/library/fk6t46tz%28v=vs.80%29.aspx

    • ¿Cuál es el punto de un bloque FINALLY? no sería la siguiente línea de fuera del bloque TRY acaba de ser ejecutado independientemente de todos modos? ¿Por qué molestarse con un FINALMENTE?
    • href=»http://stackoverflow.com/questions/547791/why-use-finally-in-c»>stackoverflow.com/questions/547791/why-use-finally-in-c
    • Viejo post/comentarios. @Doug – mi caso es el registro de cualquier llamada a la API, independientemente de los errores o no. Por lo tanto, finally entra en juego, en lugar de usar (2) «registro» de las llamadas en el bloque try, y luego de la captura.
  2. 12

    Sí la cláusula finally obtiene exeucuted si no es la excepción.
    Tomando un ejemplo

         try
            {
                int a = 10;
                int b = 20;
                int z = a + b;
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
            finally
            {
                Console.WriteLine("Executed");
            }

    Así que aquí si se supone una excepción se produce también el finalmente ejecutado.

  3. 5

    Un uso común de la captura y finalmente juntos es la obtención y uso de los recursos en un bloque try, lidiar con circunstancias excepcionales en un bloque catch, y la liberación de los recursos en el bloque finally.

    Para obtener más información y ejemplos sobre la re-lanzar excepciones, vea try-catch y Lanzar Excepciones. Para obtener más información sobre el bloque finally, ver try-finally.

    public class EHClass
    {
        void ReadFile(int index)
        {
            //To run this code, substitute a valid path from your local machine 
            string path = @"c:\users\public\test.txt";
            System.IO.StreamReader file = new System.IO.StreamReader(path);
            char[] buffer = new char[10];
            try
            {
                file.ReadBlock(buffer, index, buffer.Length);
            }
            catch (System.IO.IOException e)
            {
                Console.WriteLine("Error reading from {0}. Message = {1}", path, e.Message);
            }
    
            finally
            {
                if (file != null)
                {
                    file.Close();
                }
            }
            //Do something with buffer...
        }
    
    }
  4. 0

    bloque finally siempre se ejecuta , no importa qué.
    acabo de probar este método

         public int TryCatchFinally(int a, int b)
        {
            try
            {
                int sum = a + b;
                if (a > b)
                {
                    throw new Exception();
                }
                else
                {
                    int rightreturn = 2;
                    return rightreturn;
                }
            }
            catch (Exception)
            {
                int ret = 1;
                return ret;
            }
            finally
            {
                int fin = 5;
            }
        }
  5. 0
            try
            {
                //Function to Perform
            }
            catch (Exception e)
            {
             //You can display what error occured in Try block, with exact technical spec (DivideByZeroException)
                throw; 
                //Displaying error through signal to Machine, 
                //throw is usefull , if you calling a method with try from derived class.. So the method will directly get the signal                
            }
    
            finally  //Optional
            {
                //Here You can write any code to be executed after error occured in Try block
                Console.WriteLine("Completed");
            }
    • El finally siempre se consigue el ejecutado, si el catch apresado un error o no.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea