miércoles, 16 de mayo de 2012

Try...Catch...Finally Visual Basic

Una instrucción Try…Catch consiste en un bloque Try seguido de una o más cláusulas Catch, que especifican controladores para varias excepciones. Cuando se produce una excepción en un bloque Try, Visual Basic busca la instrucción Catch que controla la excepción. Si no se encuentra una instrucción Catch coincidente, Visual Basic examina el método que llamó al método actual, y así sucesivamente hasta la pila de llamadas. Si no se encuentra ningún bloque Catch, Visual Basic muestra al usuario un mensaje de excepción no controlada y detiene la ejecución del programa.  

Puede utilizar más de una instrucción Catch en una instrucción Try…Catch . Si lo hace, el orden de las cláusulas Catch es significativo debido a que se examinan en orden. Las excepciones más específicas se capturan antes que las menos específicas.
Las siguientes condiciones de la instrucción Catch son las menos específicas y detectarán todas las excepciones que se deriven de la clase Exception. Normalmente debe utilizar una de estas variaciones como el último bloque Catch de la estructura Try...Catch...Finally, después de detectar todas las excepciones específicas que espera. El flujo de control nunca puede alcanzar un bloque Catch situado detrás de cualquiera de estas variaciones.
  • El type es Exception, por ejemplo: Catch ex As Exception
  • La instrucción no tiene ninguna variable exception, por ejemplo: Catch
Cuando una instrucción Try…Catch…Finally está anidada en otro bloque Try, Visual Basic primero examina cada instrucción Catch en el bloque Try más interno. Si no encuentra ninguna instrucción Catch coincidente, la búsqueda continúa en las instrucciones Catch del bloque Try…Catch…Finally exterior.

Las variables locales de un bloque Try no se encuentran disponibles en un bloque Catch porque se trata de bloques independientes. Si se desea utilizar una variable en más de un bloque, se debe declarar la variable fuera de la estructura Try...Catch...Finally.
 
Esta instrucción proporciona una manera de controlar algunos o todos los errores posibles que pueden ocurrir en un bloque de código determinado mientras se ejecuta el código.

Try
    [ tryStatements ]
    [ Exit Try ]
[ Catch [ exception [ As type ] ] [ When expression ]
    [ catchStatements ]
    [ Exit Try ] ]
[ Catch ... ]
[ Finally
    [ finallyStatements ] ]
End Try
Definicion de cada una de las variables...

Catch
Opcional. Se permite utilizar varios bloques Catch. Si se produce una excepción al procesar el bloque Try, cada instrucción Catch se examina en orden textual para determinar si controla la excepción; el parámetro exception representa la excepción que se ha producido.

Excepcion
Opcional. Cualquier nombre de variable. El valor inicial de exception es el valor del error producido. Se utiliza con Catch para especificar la captura del error. Si se omite, la instrucción Catch detecta cualquier excepción.

Exit Try
Opcional. Palabra clave que interrumpe la ejecución de la estructura Try...Catch...Finally. La ejecución se reanuda con el código que sigue inmediatamente a la instrucción End Try. Se ejecutará la instrucción Finally todavía. No se permite en bloques Finally.

Finally
Opcional. Siempre se ejecuta un bloque Finally cuando la ejecución sale de cualquier parte de la instrucción Try...Catch.
 
End Try
Finaliza la estructura Try...Catch...Finally.

El argumento instruccionesTry contiene código donde puede ocurrir un error, mientras instruccionesCatch contiene el código para controlar cualquier error que ocurra. Si ocurre un error en instruccionesTry, el control de programas se pasa a instruccionesCatch para su disposición. El valor inicial de excepción es el valor del error que ocurrió en instruccionesTry. Si no se produce ningún error, instruccionesCatch nunca se ejecuta.

Si el error no se puede controlar en las instruccionesCatch asociadas con instruccionesTry donde ocurrió el error, utilice la instrucción throw para propagar, o volver a producir, el error a un controlador de errores de nivel superior.

Después de ejecutar todas las instrucciones de instruccionesTry y no controlar ningún error en instruccionesCatch, se ejecutan las instrucciones de instruccionesFinally incondicionalmente.
Tenga en cuenta que el código dentro de instruccionesFinally se ejecuta incluso si ocurre una instrucción return dentro de los bloques try o catch, o si el bloque catch vuelve a lanzar el error.
Se garantiza que las instruccionesFinally siempre se ejecutan, a no ser que se produzca un error no controlado, (por ejemplo, si se produce un error en tiempo de ejecución dentro del bloque catch).

Ejemplo

El siguiente ejemplo muestra cómo funciona el control de excepciones en JScript:

try {
  print("Ejecutando bloque try externo...");
  try {
    print("Ejecutando bloque try anidado...");
    throw "Mi error";
  }
  catch(e) {
    print("Bloque anidado detectó el error: " + e);
    throw e + " vuelto a lanzar";
  }
  finally {
    print("Ejecutando bloque finally anidado...");
  }   
}
catch(e) {
  print("Bloque externo detectó error: " + e);
}
finally {
  print("Ejecutando bloque finally externo");
}
// Cambie esto en Windows Script Host por WScript.Echo(s)
function print(s){
   document.write(s);
}
Esto produce la siguiente salida:
Ejecutando bloque try externo...
Ejecutando bloque try anidado...
Bloque anidado detectó el error: Mi error
Ejecutando bloque finally anidado...
Bloque externo detectó el error: Mi error vuelto a lanzar
Ejecutando bloque finally externo...

Acuntinuacion  les mostrremos algunos ejemplos de  Try...Cath...Finally
Ejemplo #1

El ejemplo siguiente tiene una instrucción Try…Catch incluida en un bloque Try . El bloque Catch interior produce una excepción que tiene su propiedad InnerException establecida en la excepción original. El bloque exterior Catch informa de su propia excepción y de la excepción interna.
VB.

Private Sub InnerExceptionExample()
  Try
    Try
     ' Set a reference to a StringBuilder.
     ' The exception below does not occur if the commented
     ' statement is used instead.
       Dim sb As System.Text.StringBuilder
      'Dim sb As New System.Text.StringBuilder

     ' Cause a NullReferenceException.
        sb.Append("text")
       Catch ex As Exception
      ' Throw a new exception that has the inner exception
      ' set to the original exception.
      Throw New ApplicationException("Something happened :(", ex)
     End Try
Catch ex2 As Exception
    ' Show the exception.
    Console.WriteLine("Exception: " & ex2.Message)
    Console.WriteLine(ex2.StackTrace)

  ' Show the inner exception, if one is present.
 If ex2.InnerException IsNot Nothing Then
 Console.WriteLine("Inner Exception: " & ex2.InnerException.Message)
 Console.WriteLine(ex2.StackTrace)
        End If
    End Try
End Sub
Ejemplo #2 
El ejemplo siguiente muestra la estructura de la instrucción Try...Catch...Finally en VB. 
Public Sub TryExample()
    ' Declare variables.
    Dim x As Integer = 5
    Dim y As Integer = 0

    ' Set up structured error handling.
    Try
        ' Cause a "Divide by Zero" exception.
        x = x \ y

        ' This statement does not execute because program
        ' control passes to the Catch block when the
        ' exception occurs.
        MessageBox.Show("end of Try block")
    Catch ex As Exception
        ' Show the exception's message.
        MessageBox.Show(ex.Message)

        ' Show the stack trace, which is a list of methods
        ' that are currently executing.
        MessageBox.Show("Stack Trace: " & vbCrLf & ex.StackTrace)
    Finally
        ' This line executes whether or not the exception occurs.
        MessageBox.Show("in Finally block")
    End Try
End Sub
 Ejemplo #3
El ejemplo incluye instrucciones Catch para varios tipos de excepciones, ordenadas de la más específica a la más general  VB.
Public Sub RunSample()
    Try
        CreateException()
    Catch ex As System.IO.IOException
        ' Code that reacts to IOException.
    Catch ex As NullReferenceException
        MessageBox.Show("NullReferenceException: " & ex.Message)
        MessageBox.Show("Stack Trace: " & vbCrLf & ex.StackTrace)
    Catch ex As Exception
        ' Code that reacts to any other exception.
    End Try
End Sub

Private Sub CreateException()
    ' This code throws a NullReferenceException.
    Dim obj = Nothing
    Dim prop = obj.Name

    ' This code also throws a NullReferenceException.
    'Throw New NullReferenceException("Something happened.")
End Sub

El bloque try contiene el código protegido que puede causar la excepción. Este bloque se ejecuta hasta que se produce una excepción o hasta completarse satisfactoriamente. Por ejemplo, el siguiente intento de convertir un objeto null provoca la excepción NullReferenceException:

object o2 = null;
try
{
    int i2 = (int)o2;   // Error
}

La cláusula catch se 
puede utilizar sin argumentos, en cuyo caso captura cualquier tipo de 
excepción y se conoce como cláusula catch general. También puede aceptar
 un argumento de objeto derivado de System.Exception, en cuyo caso trata una excepción específica.