Manejo de Excepciones en C#: Try, Catch y Finally
Clase 33 de 35 • Curso de C# con .Net Core 2.1
Contenido del curso
Etapa 5 – POO reutilicemos nuestro código
- 2

Herencia para reutilizar código C#
10:30 min - 3

Herencia y Polimorfismo en Programación Orientada a Objetos
11:42 min - 4

Polimorfismo en Programación Orientada a Objetos
13:17 min - 5

Casting en C#: cuándo funciona y cuándo falla
07:09 min - 6

Conversiones seguras en C# con is y as
12:44 min - 7

Sobrescribir ToString para depuración en C#
08:15 min
Etapa 6- Ajustes y funcionalidad
Etapa 7 – Preparando información para nuestros reportes
- 11

Manejo Avanzado de Métodos y Parámetros en Programación
15:43 min - 12

Manejo de Parámetros de Salida en Visual Studio Code
04:38 min - 13

Sobrecarga de Métodos para Parámetros de Salida Opcionales
05:51 min - 14

Optimización de Listas: Buenas Prácticas en C#
04:16 min - 15

Dictionary: cómo funciona en C#
11:14 min - 16

Diccionarios con polimorfismo en C#
10:48 min - 17

Uso de Constantes y Enumeraciones para Optimizar Diccionarios en C#
11:33 min - 18

Foreach anidado para diccionarios en C#
13:47 min - 19

Depuración de diccionarios en C#
09:37 min - 20

Parámetro opcional para controlar impresión en C#
11:47 min - 21

Cómo usar switch en lugar de if/else
14:30 min - 22

Números aleatorios y eventos en C#
12:52 min - 23

Diccionarios y Refactoring en Programación Básica
02:13 min
Etapa 8 – Consultas
- 24

Cómo crear un reporteador en C sharp
11:42 min - 25

Generación segura de reportes en sistemas de información
10:21 min - 26

Construcción de reportes con LINQ en C#
11:48 min - 27

Diccionario con evaluaciones por asignatura
08:32 min - 28

Tipos anónimos en LINQ para reportes complejos
10:52 min - 29

Cálculo del Promedio de Notas Agrupadas por Alumno y Asignatura
10:46 min - 30

Creación de Tipos de Datos Personalizados en Programación Avanzada
12:05 min - 31

Generación de Reportes con LINQ en C#
02:09 min
Etapa 9 – Creando una UI de Consola
Domina el manejo de excepciones en C# con confianza: cuándo usar try, catch y, sobre todo, por qué el bloque finally siempre se ejecuta. Verás cómo las entradas por consola obligan a convertir tipos, qué ocurre cuando una excepción no coincide con un catch y cómo terminar el programa con return sin omitir limpiezas críticas.
¿Cómo funciona finally y cuándo se ejecuta?
El finally se ejecuta pase lo que pase: si todo va bien en el try, si se entra a un catch, si ocurre una excepción no controlada o incluso si hay un return dentro del try. En pruebas, se usó un beep de 2500 Hz por 500 ms, tres veces, para evidenciar la entrada al finally.
- Éxito en el try: se ejecuta finally de forma normal.
- Excepción capturada: tras el catch, se ejecuta finally.
- Excepción no capturada que revienta la app: se ejecuta finally y luego la app termina.
- return dentro de try: antes de salir de verdad, se ejecuta finally.
El aprendizaje clave es que el finally sucede justo antes de que el programa termine, no después. Aun cuando se observaron mensajes de salida por manejadores del proceso, el finally ocurrió antes del final real, asegurando cierre y limpieza.
¿Qué mostró el manejo de múltiples catch y la precedencia?
La precedencia es crítica: un catch más general antes puede “tapar” a uno más específico y el compilador avisará. Se puede capturar una excepción con o sin variable, por ejemplo catch (Exception ex) o un catch sin parámetros si no se necesita la información interna.
¿Qué pasa cuando la excepción no coincide con el catch?
Al convertir una entrada en blanco desde consola a número decimal, se lanzó una FormatException. No coincidía con el catch que esperaba otra excepción (como ArgumentOutOfRangeException), así que no cayó allí. El sistema buscó otro catch compatible y, al no hallarlo, la app terminó. Aun así, el finally se ejecutó. Esto confirma la regla: siempre se ejecuta.
¿Cómo afectó la entrada por consola y la depuración?
Se trabajó con entrada interactiva y conversión de tipos: todo lo que llega por consola es string, así que hay que convertir. Al intentar depurar en Visual Studio Code una app de consola, no fue consistente porque no hay forma de enviar la entrada esperada de modo confiable. Se prefirió seguir el flujo con dotnet run, limpiar y recompilar con .NET build y ajustar validaciones previas que interferían con el resultado. También se usó el atajo de comentario con control K+C para probar variantes.
¿Qué buenas prácticas y habilidades se refuerzan?
La mejor práctica: evitar excepciones predecibles. Si una división por cero fallaría, verifica antes que el divisor no sea cero. Cuando no puedas evitarlas:
- Maneja la excepción, recupérate y continúa el flujo.
- Si es imposible recuperar el flujo, termina con un mensaje amigable para el usuario.
El finally es clave para liberar recursos críticos incluso ante fallos o salidas anticipadas:
- Cerrar archivos y apuntadores de archivo.
- Cerrar sockets y canales cifrados.
- Enviar notificaciones o registros de error.
Habilidades y conceptos reforzados:
- Lectura desde consola y conversión de tipos desde string.
- Manejo de excepciones con try, catch, finally y uso de throw cuando corresponde.
- Precedencia y orden correcto de múltiples catch.
- Entendimiento de excepciones comunes como FormatException y diferencias con otras como ArgumentOutOfRangeException.
- Ejecución y compilación con dotnet run y .NET build para validar el flujo real.
¿En qué casos has usado finally para asegurar cierres o notificaciones al terminar tu programa, incluso si algo falla? Comparte tus escenarios y qué aprendiste al implementarlo.