Uso de Try Catch en C#
Una vez lanzada una excepción es posible escribir código que es encarge de tratarla. Por defecto, si este código no se escribe la excepción provoca que la aplicación aborte mostrando un mensaje de error en el que se describe la excepción producida (información de su propiedad Message) y dónde se ha producido (información de su propiedad StackTrace)Así, dado el siguiente código fuente de ejemplo:
using System;
class PruebaExcepciones
{
static void Main()
{
A obj1 = new A();
obj1.F();
}
}
class A
{
public void F()
{
G();
}
static public voidG()
{
int c = 0;
int d = 2/c;
}
}
Al compilarlo no se detectará ningún error ya que al compilador no le merece la pena calcular el valor de c en tanto que es una variable, por lo que no detectará que dividir 2/c no es válido. Sin embargo, al ejecutarlo se intentará dividir por cero en esa instrucción y ello provocará que aborte laaplicación mostrando el siguiente mensaje:
Unhandled Exception: System.DivideByZeroException: Attempted to divide by zero.
at PruebaExcepciones.Main()
Como se ve, en este mensaje se indica que no se ha tratado una excepción de división por cero (tipo DivideByZeroException) dentro del código del método Main() del tipo PruebaExcepciones. Si al compilar el fuente hubiésemos utilizado laopción /debug, el compilador habría creado un fichero .pdb con información extra sobre las instrucciones del ejecutable generado que permitiría que al ejecutarlo se mostrase un mensaje mucho más detallado con información sobre la instrucción exacta que provocó la excepción, la cadena de llamadas a métodos que llevaron a su ejecución y el número de línea que cada una ocupa en el fuente:
Unhandled Exception: System.DivideByZeroException: Attempted to divide by zero.
at A.G() in E:\c#\Ej\ej.cs:line 22
at A.F() in E:\c#\Ej\ej.cs:line 16
at PruebaExcepciones.Main() in E:\c#\Ej\ej.cs:line 8
Si se desea tratar la excepción hay que encerrar la división dentro de una instrucción try con la siguiente sintaxis:
try
catch ()
catch ()
...
finally
El significado de try es el siguiente: si durante la ejecución de las se lanza una excepción de tipo (o alguna subclase suya) se ejecutan las instrucciones , si fuese de tipo se ejecutaría , y así hasta que se encuentre una cláusula catch que pueda tratar laexcepción producida. Si no se encontrase ninguna y la instrucción tryestuviese anidada dentro de otra, se miraría en los catch de su try padre y se repetiría el proceso. Si al final se recorren todos los trys padres y no se encuentra ningún catch compatible, entonces se buscaría en el código desde el que se llamó al método que produjo la excepción. Si así se termina llegando al método que inicióel hilo donde se produjo la excepción y tampoco allí se encuentra un tratamiento apropiado se aborta dicho hilo; y si ese hilo es el principal (el que contiene el punto de entrada) se aborta el programa y se muestra el mensaje de error con información sobre la excepción lanzada ya visto.
Así, para tratar la excepción del ejemplo anterior de modo que una división por cero provoque que a d se leasigne el valor 0, se podría reescribir G() de esta otra forma:
static public void G()
{
try
{
int c = 0;
int d = 2/c;
}
catch (DivideByZeroException)
{ d=0; }
}
Para simplificar tanto el compilador como el código generado y favorecer la legibilidad del...
Regístrate para leer el documento completo.