Beruflich Dokumente
Kultur Dokumente
Este es el ejemplo más clásico de una operación aritmética que genera un estado
anómalo. Un ejemplo particular del error generado por el intento de dividir por cero lo
encontramos en la calculadora de Bing:
• try
• catch
• finally
• throw
2. Excepciones en C#
El lenguaje de programación C# permite controlar la generación de una excepción a
través de las construcciones try, catch, finally, y throw. La primera de estas -
try-, encierra el bloque de código que pudiera generar una excepción, si ocurriera
una excepción en el bloque try, el o los bloques catch se encargan de capturar la
excepción para un tratamiento o manejo específico a la excepción generada. Con
finally, se ejecutan operaciones una vez se finaliza el conjunto de sentencias
encerradas en el bloque try, o después de haber sido la excepción en un bloque
catch. (En las secciones posteriores nos detendremos en cada una de estas
construcciones para mostrar varios detalles importantes a la manejar una excepción.)
namespace ConsoleApplication18
{
public sealed class SinControlExcepciones
{
public static int Dividir(int a, int b)
{
// La expresión `a / b` es propensa a generar la
// excepción de división entre cero:
EXCEPCIONES
UNIVERSIDAD MARIANO GALVEZ – CAMPUS CENTRAL – Programación I – Lenguaje C# – Sección E
Primer Semestre – Ciclo 3 – Año 2018 – Ing. MBA. Juan Carlos Méndez N. Página 3 de 11
return a / b;
}
Como resulta evidente, el mensaje coincide con la evaluación de una expresión que
incluye una división entre cero. El mensaje de excepción también nos indica que la
excepción no ha sido controlada o manejada (Unhandled Exception); además, de la
locación en donde se ha generado.
Finalmente, el programa finaliza su ejecución de forma abrupta, debido a que la
excepción no ha sido manejada.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication18
{
public sealed class ControlDEExcepciones
{
public static int Dividir(int a, int b)
{
EXCEPCIONES
UNIVERSIDAD MARIANO GALVEZ – CAMPUS CENTRAL – Programación I – Lenguaje C# – Sección E
Primer Semestre – Ciclo 3 – Año 2018 – Ing. MBA. Juan Carlos Méndez N. Página 4 de 11
if (b == 0)
{
throw new DivideByZeroException();
}
return a / b;
}
try
{
resultado = Dividir(num1, num2);
Console.WriteLine("\nLa división de {0} entre {1} es
igual a {2}\n", num1,
num2, resultado);
}
catch (DivideByZeroException e)
{
Console.WriteLine("\nIntento de división entre 0\n");
Console.ReadKey();
}
}
}
}
En el método Dividir validamos que el divisor sea igual a cero, de ser así, entonces
lanzamos la excepción DividyByZeroException a través de la sentencia:
En caso que el divisor sea distinto de cero, entonces se realiza la operación de división
de manera normal.
Try
{
... // sección de código propensa a generar excepciones
}
finally
{
// código de liberación de recursos
}
3.1 try-catch
La sentencia try-catch está compuesta por un bloque de sentencias proclives a
generar situaciones inesperadas o excepcionales; este bloque (try) se encierra entre
corchetes ({, y }), y va seguido por una o más clausulas catch. Cada una de las
clausulas corresponde con un tipo de excepción. Debido a que las excepciones
integradas en la biblioteca base de clases y las creadas por el propio programador
derivan de la clase base System.Exception , el orden (arriba-abajo) en que deben
organizarse las excepciones ha de empezar por el tipo de excepción más específico (o
con el orden jerarquía menor).
object o = null;
try
{
int i = (int) o; // Error
}
object o = null;
try
{
int i = (int) o; // Error
}
catch (InvalidCastException e)
{
Console.WriteLine ("Intento de conversión inválido.");
}
Un bloque try, puede estar seguido por una o más clausulas y deben seguir el orden
(arriba-abajo) de tipos de excepciones específicos a más generales. El compilador de
EXCEPCIONES
UNIVERSIDAD MARIANO GALVEZ – CAMPUS CENTRAL – Programación I – Lenguaje C# – Sección E
Primer Semestre – Ciclo 3 – Año 2018 – Ing. MBA. Juan Carlos Méndez N. Página 7 de 11
C#, generará un error al declarar una clausula catch con un tipo general y más
adelante uno específico. Con un ejemplo queda más claro:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication18
{
public sealed class OrdenCatch
{
public static void Main()
{
object o = null;
try
{
int i = (int)o;
}
catch (Exception e)
{
//...
}
catch (InvalidCastException e)
{
//...
}
}
}
}
¿El flujo de ejecución se haya dentro de una sentencia try es proclive a lanzar una
excepción?
EXCEPCIONES
UNIVERSIDAD MARIANO GALVEZ – CAMPUS CENTRAL – Programación I – Lenguaje C# – Sección E
Primer Semestre – Ciclo 3 – Año 2018 – Ing. MBA. Juan Carlos Méndez N. Página 8 de 11
catch (DivideByZero)
{
// ...
}
catch ()
{
// ...
}
Este tipo de clausula catch, atrapará cualquier tipo de excepción generada en el
bloque try subyacente.
EXCEPCIONES
UNIVERSIDAD MARIANO GALVEZ – CAMPUS CENTRAL – Programación I – Lenguaje C# – Sección E
Primer Semestre – Ciclo 3 – Año 2018 – Ing. MBA. Juan Carlos Méndez N. Página 9 de 11
las situaciones que pueden impedir el paso al bloque finally son un ciclo infinito,
o la terminación abrupta (e.g., desbordamiento de memoria) del programa.
try
{
sr = File.OpenText ("archivo.txt");
if (sr.EndOfStream)
{
return;
}
Console.WriteLine (sr.ReadToEnd());
}
EXCEPCIONES
UNIVERSIDAD MARIANO GALVEZ – CAMPUS CENTRAL – Programación I – Lenguaje C# – Sección E
Primer Semestre – Ciclo 3 – Año 2018 – Ing. MBA. Juan Carlos Méndez N. Página 10 de 11
finally
{
if (reader != null )
{
if (reader != null )
}
}
}
4. Sentencia using
Aquellas clases que implementan la interfaz System.IDisposable encapsulan
recursos no administrador por la CLR, como: archivos, gráficos, o bases de datos. Estas
clases implementan al método abstracto Dispose para la liberación de los recursos
(e.g., memoria) ocupados en su manejo. Para este tipo de clases, la sentencia
using provee una sintaxis más cómoda y versatil que usar la sentencia try-catch-
finally.
En lugar de
StreamReader sr = File.OpenText ("archivo.txt");
try
{
// ...
}
finally
{
if (sr != null)
{
((IDisposable)sr).Dispose();
}
}
// ...
};
Es evidente que este último modo es más cómodo, pues nos ahorra la liberación de
recursos por parte nuestra.
Resumen
Las excepciones cuentan con las siguientes características o propiedades :