WPF - Manejo de excepciones
Una excepción es cualquier condición de error o comportamiento inesperado que se encuentra durante la ejecución de un programa. Se pueden plantear excepciones debido a muchas razones, algunas de ellas son las siguientes:
Fallo en su código o en el código que llama (como una biblioteca compartida),
Recursos del sistema operativo no disponibles,
Condiciones inesperadas que encuentra un tiempo de ejecución de lenguaje común (como código que no se puede verificar)
Sintaxis
Las excepciones tienen la capacidad de transferir el flujo de un programa de una parte a otra. En .NET Framework, el manejo de excepciones tiene las siguientes cuatro palabras clave:
try - En este bloque, el programa identifica una determinada condición que genera alguna excepción.
catch- La palabra clave catch indica la captura de una excepción. UNtry El bloque va seguido de uno o más catch bloques para detectar una excepción con un controlador de excepciones en el lugar de un programa donde desea manejar el problema.
finally- El bloque finalmente se usa para ejecutar un conjunto dado de declaraciones, tanto si se lanza una excepción como si no. Por ejemplo, si abre un archivo, debe cerrarse tanto si se genera una excepción como si no.
throw- Un programa lanza una excepción cuando aparece un problema. Esto se hace usando una palabra clave de lanzamiento.
La sintaxis para usar estas cuatro palabras clave es la siguiente:
try {
///This will still trigger the exception
}
catch (ExceptionClassName e) {
// error handling code
}
catch (ExceptionClassName e) {
// error handling code
}
catch (ExceptionClassName e) {
// error handling code
}
finally {
// statements to be executed
}
Se utilizan varias sentencias catch en aquellos casos en los que un bloque try puede generar más de una excepción según la situación del flujo de un programa.
Jerarquía
Casi todas las clases de excepción en el marco .NET se derivan directa o indirectamente de la clase Exception. Las clases de excepción más importantes derivadas de la clase Exception son:
ApplicationException class- Soporta excepciones generadas por programas. Cuando el desarrollador desea definir una excepción, la clase debe derivarse de esta clase.
SystemException class- Es la clase base para todas las excepciones del sistema de tiempo de ejecución predefinidas. La siguiente jerarquía muestra las excepciones estándar proporcionadas por el tiempo de ejecución.
La siguiente tabla enumera las excepciones estándar proporcionadas por el tiempo de ejecución y las condiciones bajo las cuales debe crear una clase derivada.
Tipo de excepción | Tipo de base | Descripción |
---|---|---|
Exception | Objeto | Clase base para todas las excepciones. |
SystemException | Excepción | Clase base para todos los errores generados en tiempo de ejecución. |
IndexOutOfRangeException | SystemException | Lanzado por el tiempo de ejecución solo cuando una matriz está indexada incorrectamente. |
NullReferenceException | SystemException | Lanzado por el tiempo de ejecución solo cuando se hace referencia a un objeto nulo. |
AccessViolationException | SystemException | Lanzado por el tiempo de ejecución solo cuando se accede a una memoria no válida. |
InvalidOperationException | SystemException | Lanzado por métodos cuando está en un estado no válido. |
ArgumentException | SystemException | Clase base para todas las excepciones de argumentos. |
ArgumentNullException | ArgumentException | Lanzado por métodos que no permiten que un argumento sea nulo. |
ArgumentOutOfRangeException | ArgumentException | Lanzado por métodos que verifican que los argumentos están en un rango determinado. |
ExternalException | SystemException | Clase base para excepciones que ocurren o están dirigidas a entornos fuera del tiempo de ejecución. |
SEHException | Excepción externa | Excepción que encapsula la información de manejo de excepciones estructuradas de Win32. |
Ejemplo
Tomemos un ejemplo sencillo para comprender mejor el concepto. Comience creando un nuevo proyecto WPF con el nombreWPFExceptionHandling.
Arrastre un cuadro de texto desde la caja de herramientas a la ventana de diseño. El siguiente código XAML crea un cuadro de texto y lo inicializa con algunas propiedades.
<Window x:Class = "WPFExceptionHandling.MainWindow"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local = "clr-namespace:WPFExceptionHandling"
mc:Ignorable = "d"
Title = "MainWindow" Height = "350" Width = "604">
<Grid>
<TextBox x:Name = "textBox" HorizontalAlignment = "Left"
Height = "241" Margin = "70,39,0,0" TextWrapping = "Wrap"
VerticalAlignment = "Top" Width = "453"/>
</Grid>
</Window>
Aquí está la lectura de archivos con manejo de excepciones en C #.
using System;
using System.IO;
using System.Windows;
namespace WPFExceptionHandling {
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
ReadFile(0);
}
void ReadFile(int index) {
string path = @"D:\Test.txt";
StreamReader file = new StreamReader(path);
char[] buffer = new char[80];
try {
file.ReadBlock(buffer, index, buffer.Length);
string str = new string(buffer);
str.Trim();
textBox.Text = str;
}
catch (Exception e) {
MessageBox.Show("Error reading from "+ path + "\nMessage = "+ e.Message);
}
finally {
if (file != null) {
file.Close();
}
}
}
}
}
Cuando compile y ejecute el código anterior, producirá la siguiente ventana en la que se muestra un texto dentro del cuadro de texto.
Cuando se genera una excepción o la lanza manualmente (como en el siguiente código), mostrará un cuadro de mensaje con el error.
using System;
using System.IO;
using System.Windows;
namespace WPFExceptionHandling {
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
ReadFile(0);
}
void ReadFile(int index) {
string path = @"D:\Test.txt";
StreamReader file = new StreamReader(path);
char[] buffer = new char[80];
try {
file.ReadBlock(buffer, index, buffer.Length);
string str = new string(buffer);
throw new Exception();
str.Trim();
textBox.Text = str;
}
catch (Exception e) {
MessageBox.Show("Error reading from "+ path + "\nMessage = "+ e.Message);
}
finally {
if (file != null) {
file.Close();
}
}
}
}
}
Cuando se genera una excepción mientras se ejecuta el código anterior, se mostrará el siguiente mensaje.
Le recomendamos que ejecute el código anterior y experimente con sus características.