sábado, 14 de noviembre de 2009
TRY CATCH
La instrucción try-catch consta de un bloque try seguido de una o más cláusulas catch, las cuales especifican controladores para diferentes excepciones.
Comentarios
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:
Copiar código
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. Por ejemplo:
Copiar código
catch (InvalidCastException e)
{
}
Es posible utilizar más de una cláusula catch específica en la misma instrucción try-catch. En este caso, el orden de las cláusulas catch es importante, ya que las cláusulas catch se examinan por orden. Las excepciones más específicas se capturan antes que las menos específicas.
Se puede utilizar una instrucción throw en el bloque catch para volver a producir la excepción, la cual ha sido capturada por la instrucción catch. Por ejemplo:
Copiar código
catch (InvalidCastException e)
{
throw (e); // Rethrowing exception e
}
Si desea volver a producir la excepción que está siendo actualmente controlada por una cláusula catch sin parámetros, use la instrucción throw sin argumentos. Por ejemplo:
Copiar código
catch
{
throw;
}
Dentro de un bloque try, inicialice sólo variables declaradas en su interior; en caso contrario, puede producirse una excepción antes de que se complete la ejecución del bloque. Por ejemplo, en el siguiente ejemplo de código, la variable x se inicializa dentro del bloque try. Al intentar utilizar esta variable fuera del bloque try en la instrucción Write(x), se generará el siguiente error del compilador: Uso de variable local no asignada.
Copiar código
static void Main()
{
int x;
try
{
// Don't initialize this variable here.
x = 123;
}
catch
{
}
// Error: Use of unassigned local variable 'x'.
Console.Write(x);
}
Para obtener más información acerca de catch, vea try-catch-finally.
Ejemplo
En este ejemplo, el bloque try contiene una llamada al método MyMethod(), que puede producir una excepción. La cláusula catch contiene el controlador de excepciones, el cual simplemente muestra un mensaje en la pantalla. Cuando se realiza la llamada a la instrucción throw desde dentro de MyMethod, el sistema busca la instrucción catch y muestra el mensaje Exception caught.
Copiar código
// try_catch_example.cs
using System;
class MainClass
{
static void ProcessString(string s)
{
if (s == null)
{
throw new ArgumentNullException();
}
}
static void Main()
{
try
{
string s = null;
ProcessString(s);
}
catch (Exception e)
{
Console.WriteLine("{0} Exception caught.", e);
}
}
}
Resultados del ejemplo
System.ArgumentNullException: Value cannot be null.
at MainClass.Main() Exception caught.
En este ejemplo, se utilizan dos instrucciones catch. La excepción más específica, que aparece en primer lugar, se captura primero.
Copiar código
// try_catch_ordering_catch_clauses.cs
using System;
class MainClass
{
static void ProcessString(string s)
{
if (s == null)
{
throw new ArgumentNullException();
}
}
static void Main()
{
try
{
string s = null;
ProcessString(s);
}
// Most specific:
catch (ArgumentNullException e)
{
Console.WriteLine("{0} First exception caught.", e);
}
// Least specific:
catch (Exception e)
{
Console.WriteLine("{0} Second exception caught.", e);
}
}
}
Resultados del ejemplo
System.ArgumentNullException: Value cannot be null.
at MainClass.Main() First exception caught.
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
Partes
tryStatements
Opcional. Instrucciones en las que puede ocurrir un error. Puede ser una instrucción compuesta.
Catch
Opcional. Se permite utilizar varios bloques Catch. Si tiene lugar una excepción mientras se procesa 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.
exception
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.
type
Opcional. Especifica el tipo de filtro de clase. Si el valor de exception es del tipo especificado en type o de un tipo derivado, el identificador queda enlazado al objeto de excepción.
When
Opcional. Una instrucción Catch con una cláusula When sólo detecta las excepciones cuando expression se evalúa como True. Una cláusula When sólo se aplica después de comprobar el tipo de la excepción y expression puede hacer referencia al identificador que representa la excepción.
expression
Opcional. Debe ser convertible implícitamente a Boolean. Cualquier expresión que describe un filtro genérico. Se utiliza normalmente para filtrar por número de error. Se utiliza con la palabra clave When para especificar las circunstancias bajo las que se captura el error.
catchStatements
Opcional. Instrucciones para controlar los errores que se producen en el bloque Try. Puede ser una instrucción compuesta.
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.
finallyStatements
Opcional. Instrucciones que se ejecutan después de las demás operaciones de procesamiento de error.
End Try
Finaliza la estructura Try...Catch...Finally.
Comentarios
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.
El bloque Try contiene código donde puede producirse un error, mientras que el bloque Catch contiene el código para controlar cualquier error que tenga lugar. Si se produce un error en el bloque Try, el control del programa pasa a la instrucción Catch apropiada para su procesamiento. El argumento exception es una instancia de la clase Exception o una clase que se deriva de la clase Exception. La instancia de la clase Exception corresponde al error que se produjo en el bloque Try. La instancia contiene información acerca del error, como el número de error y el mensaje.
Si una instrucción Catch no especifica un argumento exception, detectará cualquier tipo de excepción del sistema o de la aplicación. Esta variación debe utilizarse siempre como el último bloque Catch en la estructura Try...Catch...Finally, después de detectar todas las excepciones específicas anticipadas. El flujo de control nunca puede alcanzar un bloque Catch situado detrás de Catch sin un argumento exception.
En situaciones de confianza parcial, como una aplicación alojada en un recurso compartido de red, Try...Catch...Finally no detectará las excepciones de seguridad que se produzcan antes de invocar al método que contiene la llamada. El ejemplo siguiente, si se coloca en un recurso compartido de servidor y se ejecuta desde el mismo, producirá el error: "Sub System.Security.SecurityException: Error de solicitud". Para obtener más información sobre excepciones de seguridad, vea la clase SecurityException.
Visual Basic
Copiar código
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles Button1.Click
Try
Process.Start("http://www.microsoft.com")
Catch ex As Exception
MsgBox("Can't load Web page" & vbCrLf & ex.Message)
End Try
End Sub
En este tipo de situación de confianza parcial, hay que colocar la instrucción Process.Start en un procedimiento Sub independiente. La llamada inicial a Sub producirá un error, lo que permite que Try...Catch lo capture antes de que se inicie el procedimiento Sub que contiene Process.Start y se produzca la excepción de seguridad.
Ejemplo
En el siguiente ejemplo simplificado se muestra la estructura de la instrucción Try...Catch...Finall
Copiar código
Public Sub TryExample()
Dim x As Integer = 5 ' Declare variables.
Dim y As Integer = 0
Try ' Set up structured error handling.
x = x \ y ' Cause a "Divide by Zero" error.
Catch ex As Exception When y = 0 ' Catch the error.
Beep()
MsgBox("You tried to divide by 0.") ' Show an explanatory message.
Finally
Beep() ' This line is executed no matter what.
End Try
End Sub
Suscribirse a:
Enviar comentarios (Atom)
No hay comentarios:
Publicar un comentario