Manejo de excepciones en entrada por consola C#

Clase 32 de 35Curso de C# con .Net Core 2.1

Resumen

Aprende a crear un flujo de entrada por consola en C Sharp con validación robusta, mensajes amigables y manejo de excepciones. Verás cómo capturar nombre y nota para una evaluación, normalizar datos, convertir a tipos numéricos y controlar try/catch con excepciones específicas como ArgumentException y ArgumentOutOfRangeException.

¿Cómo crear un objeto por consola en C Sharp?

Para construir una evaluación desde la consola, primero se crea el objeto sin inicializar y luego se completan sus propiedades con datos validados. El foco está en dos campos: nombre (string) y nota (float).

¿Qué variables y validaciones iniciales se necesitan?

  • Crear el objeto de evaluación sin inicializar.
  • Pedir el nombre con Console.ReadLine.
  • Validar con string.IsNullOrWhiteSpace para evitar vacío o espacios.
  • Decidir si lanzar ArgumentException o mostrar mensajes y terminar el programa.
  • Normalizar el nombre con toLower para mantener consistencia.
  • Confirmar con un mensaje de éxito.
// Objeto de evaluación sin inicializar
var newEval = new Evaluacion();

// Pedir nombre
printer.WriteLine("Ingrese el nombre de la evaluación y presione Enter");
printer.PresioneEnter();
var nombre = Console.ReadLine();

if (string.IsNullOrWhiteSpace(nombre))
{
    // Alternativa sin excepción
    printer.WriteTitle("El valor nombre no puede ser vacío");
    printer.WriteLine("Saliendo del programa.");
    return;
    // Alternativa con excepción:
    // throw new ArgumentException("El valor del nombre no puede ser vacío.");
}

// Normalizar y asignar
newEval.nombre = nombre.ToLower();
printer.WriteLine("El nombre de la evaluación ha sido ingresado correctamente.");

¿Cómo mejorar la experiencia con mensajes del printer?

  • Centraliza textos repetidos como "Presione Enter para continuar" en un método Printer.PresioneEnter.
  • Usa Printer.WriteTitle y Printer.WriteLine para comunicar errores sin que el programa "reviente".
  • Evita mensajes técnicos para el usuario final cuando no aportan valor.

¿Cómo convertir y validar la nota con manejo de excepciones?

La nota se captura como string, se valida vacío y luego se convierte a float. La conversión puede fallar, así que se usa try/catch para controlar errores y dar mensajes claros.

¿Cómo parsear y manejar errores con try catch?

  • Capturar notaString con Console.ReadLine.
  • Validar vacío con string.IsNullOrWhiteSpace.
  • Convertir con float.Parse dentro de try.
  • Usar un catch genérico para errores de formato y notificar: "no es un número válido".
  • En la demostración, el sistema interpretó coma o punto en la nota al convertir con float.Parse.
printer.WriteLine("Ingrese la nota de la evaluación");
printer.PresioneEnter();
var notaString = Console.ReadLine();

if (string.IsNullOrWhiteSpace(notaString))
{
    printer.WriteTitle("El valor de la nota no puede ser vacío");
    printer.WriteLine("Saliendo del programa.");
    return;
}

try
{
    newEval.nota = float.Parse(notaString);

    // Validación de rango
    if (newEval.nota < 0 || newEval.nota > 5)
    {
        throw new ArgumentOutOfRangeException("La nota debe estar entre cero y cinco.");
    }

    printer.WriteLine("La nota de la evaluación ha sido ingresada correctamente.");
}
catch (ArgumentOutOfRangeException argE)
{
    printer.WriteLine(argE.Message);
    printer.WriteLine("Saliendo del programa.");
}
catch (Exception)
{
    printer.WriteLine("El valor de la nota no es un número válido, saliendo de la aplicación.");
}

¿Cómo validar el rango permitido de la nota?

  • Define el rango válido: de 0 a 5 inclusive.
  • Si está fuera, lanza ArgumentOutOfRangeException con un mensaje claro.
  • Usa un catch específico para esta excepción y muestra su Message.

¿Por qué el orden de los catch importa en C Sharp?

El manejo de excepciones funciona en "cascada": el sistema evalúa de arriba hacia abajo. Un catch genérico de Exception colocado primero atrapará todo y hará inalcanzables los catch específicos.

¿Qué es la captura en cascada y cómo afecta?

  • Coloca primero los catch específicos como ArgumentOutOfRangeException.
  • Deja el catch genérico de Exception al final para casos no previstos.
  • Si pones el genérico primero, el IDE advertirá que los catch siguientes no se ejecutarán.

¿Te gustaría compartir cómo validas entradas por consola o qué mensajes usas para mejorar la experiencia de usuario?