lunes, 8 de junio de 2009

Practica Teorica Excepciones

1- Que son las excepciones y como se manejan

Es la indicación de un problema que ocurre durante la ejecución de un programa. El nombre excepción viene del hecho de que, aunque puede ocurrir un problema, este ocurre con poco frecuencia. Si la “regla”es que una instrucion generalmente se ejecuta en forma correcta, entonces la ocurrencia de un problema representa la “excepción a la regla”.

2- Cuando utilizar el manejo de excepciones

El manejo de excepciones permite a los programadores remover el código para manejo de errores de la “línea principal” de ejecución del programa, lo cual mejora su claridad y aumenta la capacidad de modificación del mismo.

3 y 4- Ejemplo de manejo de excepciones manejando varios catch

El siguiente ejemplo utiliza el manejo de excepciones para procesar cualquier excepción DivideByZeroexception y FormatException que pueda surgir.

1 // Fig. 12.2: DivideByZeroTest.cs

2 // Exception handlers for FormatException and DivideByZeroException.

3 using System;

4 using System.Windows.Forms;

5

6 namespace DivideByZeroTest

7 {

8 public partial class DivideByZeroTestForm : Form

9 {

10 public DivideByZeroTestForm()

11 {

12 InitializeComponent();

13 } // end constructor

14

15 // obtain 2 integers from the user

16 // and divide numerator by denominator

17 private void DivideButton_Click( object sender, EventArgs e )

18 {

19 OutputLabel.Text = ""; // clear Label OutputLabel

20

21 // retrieve user input and calculate quotient

22 try

23 {

24 // Convert.ToInt32 generates FormatException

25 // if argument is not an integer

26 int numerator = Convert.ToInt32( NumeratorTextBox.Text );

27 int denominator = Convert.ToInt32( DenominatorTextBox.Text );

28

29 // division generates DivideByZeroException

30 // if denominator is 0

31 int result = numerator / denominator;

32

33 // display result in OutputLabel

34 OutputLabel.Text = result.ToString();

35 } // end try

36 catch ( FormatException )

37 {

38 MessageBox.Show( "You must enter two integers.",

39 "Invalid Number Format", MessageBoxButtons.OK,

40 MessageBoxIcon.Error );

41 } // end catch

42 catch ( DivideByZeroException divideByZeroExceptionParameter )

43 {

44 MessageBox.Show( divideByZeroExceptionParameter.Message,

45 "Attempted to Divide by Zero", MessageBoxButtons.OK,

46 MessageBoxIcon.Error );

47 } // end catch

48 } // end method DivideButton_Click

49 } // end class DivideByZeroTestForm

50 } // end namespace DivideByZeroTest

5 y 7- Ejemplo de finally y trow

class UsoDeExcepciones

{

static void Main()

{

// Caso 1: No ocurren excepciones en el metodo que se llamó

Console.WriteLine("Llamando a NoLanzaExcepcion");

NoLanzaExcepcion();

// Caso 2: Ocurre una excepción y se atrapa en el metodo que se llamó

Console.WriteLine("Llamando a LanzaExcepcionConCatch");

LanzaExcepcionConCatch();

// Caso 3: Ocurre una excepcion, pero no se atrapa en el metodo que se llamo,

// ya que no hay bloque catch.

Console.WriteLine("Llamado a LanzaExcepcionSinCatch");

// llama a LanzaExcepcionSinCatch

try

{

LanzaExcepcionSinCatch();

} // fin de try

catch

{

Console.WriteLine("Atrapó la excepción de " + "LanzaExcepcionSinCatch en Main");

} // fin de catch

// Caso 4: Ocurre una excepción y se atrapa en el metodo que se llamo,

// despues se vuelve a lanzar al que hizo la llamada.

Console.WriteLine("Llamando a LanzaExcepcionCatchLanzaDeNuevo");

// llama a LanzaExcepcionCatchLanzaDeNuevo

try

{

LanzaExcepcionCatchLanzaDeNuevo();

}

catch

{

Console.WriteLine("atrapó la excepción de " + "LanzaExcepcionCatchLanzaDeNuevo en Main");

Console.ReadLine();

} // fin de catch

} // fin del metodo Main

// no se lanzan excepciones

static void NoLanzaExcepcion()

{

// el bloque try no lanza excepciones

try

{

Console.WriteLine("En NoLanzaExcepcion");

} // fin de try

catch

{

Console.WriteLine("Este bloque catch nunca se ejecuta");

} // fin de catch

finally

{

Console.WriteLine("se ejecutó finally en NolanzaExcepcion");

} // fin de finally

Console.WriteLine("Fin de NoLanzaExcepcion");

} // fin de metodo NoLanzaExcepcion

//lanza la excepción y la atrapa en forma local

static void LanzaExcepcionConCatch()

{

// el bloque try lanza la excepcion

try

{

Console.WriteLine("En LanzaExcepcionConCatch");

throw new Exception("excepción en LanzaExcepcionConCatch");

} // fin de try

catch (Exception parametroExcepcion)

{

Console.WriteLine("Mensaje: " + parametroExcepcion.Message);

} // fin de catch

finally

{

Console.WriteLine("se ejecutó finally en LanzaExcepcionConCatch");

} // fin de finally

Console.WriteLine("Fin de LanzaExcepcionConCatch");

} // fin del metodo LanzaExcepcionConCatch

// lanza la excepción y no la atrapa en forma local

static void LanzaExcepcionSinCatch()

{

// lanza la excepcion, pero no la atrapa

try

{

Console.WriteLine("En LanzaExcepcionSinCatch");

throw new Exception("Excepción en LanzaExepcionSinCatch");

} // fin de try

finally

{

Console.WriteLine("Se ejecutó finally en" + "LanzaExcepcionSinCatch");

} // fin de finally

// codigo inalcanzable; error logico

Console.WriteLine("Fin de LanzaExcepcionSinCatch");

} // fin del metodo LanzaExcepcionSinCatch

// lanza la excepcion, la atrapa y la vuelve a lanzar

static void LanzaExcepcionCatchLanzaDeNuevo()

{

// el bloque try lanza la excepcion

try

{

Console.WriteLine("En LanzaExcepcionCatchLanzaDeNuevo");

throw new Exception("Exepción en LanzaExcepcionCatchLanzaDeNuevo");

} // fin de try

catch (Exception parametroExcepcion)

{

Console.WriteLine("Mensaje: " + parametroExcepcion);

// vuelve a lanzar la exepcion para procesarla despues

throw;

// codigo inalcanzable; error logico

} // fin de catch

finally

{

Console.WriteLine("se ejecutó finally en " + "LanzaExcepcionCatchLanzaDeNuevo");

} // fin de finally

// cualquier codigo que se coloque aqui nunca se ejecutara

Console.WriteLine("Fin de LanzaExcepcionCatchLanzaDeNuevo");

} // fin del metodo LanzaExcepcionCatchLanzaDeNuevo

} // fin de la clase UsoDeExcepciones

} // fin del namespace finally

6- Describir las clases de excepciones y sus propiedades

La clase Exception del espaciado de nombres System es la clase base de la jerarquía de clases de excepciones del .Net framework. Dos de las clases mas importantes que se derivan de Exception son ApplicationException y SystemException. ApplicationException es una clase base que los programadores pueden extender para crear clases de excepciones especificas para sus aplicaciones.

El CLR genera excepciones SystemException, que pueden ocurrir en cualquier punto durante la ejecución de un programa. Podemos evitar muchas d estas excepciones si codificamos las aplicaciones en forma apropiada. Por ejemplo, si un programa trata de acceder a un subíndice de arreglo fuera de rango, el CLR lanza una excepción de tipo IndexOutOfRangeException (una clase derivada de SystemException).

Los tipos de excepcines se derivan de la clase Exception, la cual tiene varias propiedades. Estas se utilizan con frecuencia para formular mensajes de error que indican una excepción atrapada. De las propiedades mas importantes son Message y StackTrace. La propiedad Message almacena el mensaje de error asociado con un objeto Exception. Este mensaje puede ser un mensaje predeterminado asociado con el tipo de excepción, o puede ser un mensaje personalizado que se pasa al cnstructo de un objeto Exception cuando este se lanza. La propiedad StackTrace contiene un objeto string que representa la pila de llamadas a los métodos. La propiedad StackTrace representa la serie de metoos que no han terminado de procesarse al momento en que ocurre la excepción.

La clase Exception tiene otras propiedades, incluyendo HelpLink, Source y TargetSite. La propiedad HelpLink especifica la ubicación del archivo de ayuda que describe el problema que ocurrió. Esta propiedad es null si no existe dicho archivo. La propiedad Source especifica el nombre de la aplicación en la que ocurrió la excepción. La propiedad TargetSite especifica el método en donde se origino la excepción.


8- Crear excepciones definidas por el usuario

En algunos casos tal ves sea conveniente crear nuevas clases de excepciones que sean especificas para los problemas que ocurran en sus programas. Las clases de excepciones definidas por el usuario deben derivarse de manera directa o indirecta de la clase ApplicationException, del espaciado de nombres System.