Manejo de excepciones en C#: Estrategias y mejores prácticas
Una excepción es un problema que surge durante la ejecución de un programa. Una excepción en C# es una respuesta a una circunstancia excepcional que ocurre mientras el programa se ejecuta, como un intento de dividir por cero.
Las excepciones proporcionan una forma de transferir control de una parte del programa a otra. El manejo de excepciones en C# se basa en cuatro palabras clave: try, catch, finally y throw.
try: Identifica un bloque de código para el cual se activan excepciones particulares. Seguido por uno o más bloques catch.
catch: Captura una excepción con un manejador en el lugar donde quiere manejar el problema.
finally: Ejecuta un conjunto de sentencias, se lance o no una excepción. Por ejemplo, si abre un archivo, debe cerrarse haya o no excepción.
throw: Lanza una excepción cuando surge un problema, usando la palabra clave throw.
Sintaxis
Suponiendo que un bloque lanza una excepción, un método la captura usando try y catch:
try {
// sentencias que causan excepción
} catch (ExceptionName e1) {
// código de manejo de error
} catch (ExceptionName e2) {
// código de manejo de error
} catch (ExceptionName eN) {
// código de manejo de error
} finally {
// sentencias a ejecutar
}
Puede listar múltiples bloques catch para capturar diferentes tipos de excepciones.
Clases de excepciones en C#
Las excepciones en C# están representadas por clases, derivadas directa o indirectamente de System.Exception. Algunas clases derivadas son System.ApplicationException y System.SystemException.
- System.ApplicationException: Base para excepciones generadas por programas de aplicación. Las excepciones definidas por programadores deben derivar de esta.
- System.SystemException: Clase base para todas las excepciones predefinidas del sistema.
Excepciones predefinidas derivadas de System.SystemException:
| Nº | Clase de excepción y descripción |
|---|---|
| 1 | System.IO.IOException: Maneja errores de E/S. |
| 2 | System.IndexOutOfRangeException: Errores al referenciar índice de array fuera de rango. |
| 3 | System.ArrayTypeMismatchException: Errores por tipo incompatible con el tipo de array. |
| 4 | System.NullReferenceException: Errores al referenciar un objeto null. |
| 5 | System.DivideByZeroException: Errores al dividir entre cero. |
| 6 | System.InvalidCastException: Errores durante conversión de tipos (casting). |
| 7 | System.OutOfMemoryException: Errores por memoria libre insuficiente. |
| 8 | System.StackOverflowException: Errores por desbordamiento de pila. |
Manejo de excepciones
C# proporciona una solución estructurada con bloques try y catch, separando el código principal del manejo de errores.
Ejemplo: División por cero
using System;
namespace AplicaciónManejoErrores {
class DivNúmeros {
int resultado;
DivNúmeros() { resultado = 0; }
public void División(int num1, int num2) {
try {
resultado = num1 / num2;
} catch (DivideByZeroException e) {
Console.WriteLine("Excepción capturada: {0}", e);
} finally {
Console.WriteLine("Resultado: {0}", resultado);
}
}
static void Main(string[] args) {
DivNúmeros d = new DivNúmeros();
d.División(25, 0);
Console.ReadKey();
}
}
}
Resultado:
Excepción capturada: System.DivideByZeroException: Attempted to divide by zero.
Resultado: 0
Creación de excepciones definidas por el usuario
Puede definir sus propias excepciones. Las clases de excepción definidas por el usuario derivan de la clase Exception.
Ejemplo:
using System;
namespace ExcepciónDefinidaUsuario {
class TestTemperatura {
static void Main(string[] args) {
Temperatura temp = new Temperatura();
try {
temp.MostrarTemp();
} catch (TempEsCeroException e) {
Console.WriteLine("TempEsCeroException: {0}", e.Message);
}
Console.ReadKey();
}
}
}
public class TempEsCeroException : Exception {
public TempEsCeroException(string message) : base(message) { }
}
public class Temperatura {
int temperatura = 0;
public void MostrarTemp() {
if (temperatura == 0) {
throw (new TempEsCeroException("Temperatura cero encontrada"));
} else {
Console.WriteLine("Temperatura: {0}", temperatura);
}
}
}
Resultado:
TempEsCeroException: Temperatura cero encontrada
Lanzamiento de objetos
Puede lanzar un objeto si deriva directa o indirectamente de System.Exception. Use throw en el bloque catch para relanzar la excepción actual:
catch (Exception e) {
...
throw e;
}
Lenguaje C
- PLC vs DCS: eligiendo el sistema de automatización adecuado
- Liebherr PHS Allround: manejo de pallets flexible y modular para producción de alta capacidad
- Liebherr amplía sistema de manejo de pallets PHS Allround para producción flexible
- Dominando las Sentencias Using en C#: Importaciones, Alias y Directivas Estáticas
- Manejo de archivos en C: Dominando E/S con fopen, fprintf, fread y fseek
- Manejo de excepciones en C++: Guía práctica con try, catch, throw
- Dominar el manejo de señales en C++: Gestión segura de interrupciones y terminación limpia del programa
- Dominando el Manejo de Excepciones en Python: try, except, else y finally Explicados
- Dominando el manejo de excepciones en Python: try, except, finally y raise efectivamente
- Dominando el manejo de excepciones en Java: Try, Catch, Finally, Throw y Throws explicados
- Sistema de Módulos Java 9: Mejoras, Link-Time e Imágenes de Runtime Personalizadas