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 inicializarvar newEval =newEvaluacion();// Pedir nombreprinter.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 asignarnewEval.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 rangoif(newEval.nota <0|| newEval.nota >5){thrownewArgumentOutOfRangeException("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?
y para Usarla se puede hacer como con los otros tipos
thrownewExcepcionMiguel("No es posible hacer esa operación"));
Este tipo de Excepciones personalizadas se usan para por ejemplo controlar errores en reglas de negocio de la aplicación.
Estas excepciones me gustan mucho.
Interesante aporte Miguel!
18 minutos para algo tan sencillo ? Este tipo de cursos aveces tienden a aburrir, se puede tener el código ya lista y explicar el concepto directamente.
De acuerdo, en la mayoria de cursos no se enfocan en lo del título del video.
En esta pagina se puede encontrar informacion detallada
///estas 3 expresiones regulares se encargan de que el valor de entrada tenga el formato de tipo float.
string pattern = @"[^0-9 .]"; //busca cualquier cosa que no sea un numero.
string patternPhase2 = @"[.]"; //busca signos de púntiación en el input.
string patternPhase3 = @"\s"; //busca espacios en el input.
//en todos los casos anteriores se evalúan los matches. if(cualquierCaracterQuenoSeaPunto > 0) lanza advertencia y vuelve a pedir un input.
if(hayEspacios > 0) lanza advertencia y vuelve a pedir un input.
if(hayMasDeUnPunto> 0) lanza advertencia y vuelve a pedir un input.
De esta manera se evita muchas excepciones debido a que solo acepta el formato de un tipo float.
lo mejor de los cursos cuando ya conoces una tecnología, son los trucos que vas aprendiendo en el repaso. Siempre hay algo nuevo que aprender.
Como este proceso de ingreso de información va a ser requerido mas de una vez he optado por crear unos métodos sencillos para requerir información al usuario , manejar las excepciones, mostrar su respectivo mensaje y después de esto volver a pedir la información. Talvez a alguien le sean de ayuda.
Estos son los metodos que escribi
#region Métodos de ingreso de valores
publicstaticvoidWriteError(string msg){Console.ForegroundColor=ConsoleColor.Red;WriteLine($"Error : {msg}");Console.ForegroundColor=ConsoleColor.White;}publicstaticvoidPressEnter(){WriteLine("Presione ENTER para continuar ...");}publicstatic string EnterString( string msg ="Ingrese un valor :", string msgValueNull ="El valor ingresado no puede ser vacio"){ string value ="";//Mostrando mensaje y leyendo el valor ingresadoWriteLine(msg);PressEnter(); value =ReadLine();try{if(string.IsNullOrEmpty(value))thrownewArgumentNullException();}catch(ArgumentNullException){WriteError(msgValueNull);EnterString(msg, msgValueNull);}catch(Exception ex){WriteError(ex.Message);EnterString(msg, msgValueNull);}return value;}publicstatic float EnterFloatNumber( string msg ="Ingrese un valor: ", string msgErrorDef ="El valor que ingresó debe ser un número (eje. 1.5, 2.0. 5)", string msgOutRange ="El valor ingresado se encuentra fuera del rango permitido", string msgValueNull ="El valor ingresado no puede ser vacio", int rangeTop =5, int rangeButtom =0){//Variables necesarias float value =0; string valueAsString ="";//Peticion del valorWriteLine(msg);PressEnter();//Recibiendo el valor valueAsString =ReadLine();try{//Verificando si es nullif(string.IsNullOrEmpty(valueAsString))thrownewArgumentNullException();//Convirtiendo value = float.Parse(valueAsString);//Verificando si esta fuera del rangoif(value > rangeTop || value < rangeButtom)thrownewArgumentOutOfRangeException();}catch(ArgumentNullException){WriteError(msgValueNull);//Uso de recursividad para volver a pedir el valorEnterFloatNumber(msg, msgErrorDef, msgOutRange, msgValueNull, rangeTop, rangeButtom);}catch(ArgumentOutOfRangeException){WriteError(msgOutRange);//Uso de recursividad para volver a pedir el valorEnterFloatNumber(msg, msgErrorDef, msgOutRange, msgValueNull, rangeTop, rangeButtom);}catch(Exception){WriteError(msgErrorDef);//Uso de recursividad para volver a pedir el valorEnterFloatNumber(msg, msgErrorDef, msgOutRange, msgValueNull, rangeTop, rangeButtom);}return value;} #endregion
Y asi fue como la utilice
//Utilizando a printer para pedir valores string _nombre =Printer.EnterString(msg:"Ingrese el nombre de la evaluación"); float _nota =Printer.EnterFloatNumber(msg:"Ingrese la nota de la evaluación");//Creando la nueva evaluacionvar newEval =newEvaluacion(){Nombre= _nombre,Nota= _nota };
Los tipos de excepciones que se pueden presentar son
AplicacionException
SystemException
IOException
Imagen de exception
Como puedo lograr que mi consola acepte la lectura del punto**(.)** y de la coma**(,)** por igual?
si hablas al insertar flotantes incluso el mismo lo menciona, que el sistema es capaz de interpretar cuando ingresas 5.0 o 5,0 y los toma por igual. c:
yo hice la prueba y el valor no resulta igual
Excepciones y cascadeo de Excepciones
En C#, los errores del programa en tiempo de ejecución se propagan a través del programa mediante un mecanismo denominado excepciones. Las excepciones las inicia el código que encuentra un error y las detecta el código que puede corregir dicho error. El entorno de ejecución .NET o el código de un programa pueden producir excepciones. Una vez iniciada, una excepción se propaga hasta la pila de llamadas hasta que encuentra una instrucción catch para la excepción. Las excepciones no detectadas se controlan mediante un controlador de excepciones que ofrece el sistema y muestra un cuadro de diálogo.
Para capturar una excepción se puede realizar de la siguiente manera:
if(string.IsNullOrWhiteSpace(nombre)){thrownewArgumentException("El valor del nombre no puede ser vacío");}
En este ejemplo se realiza la validación sobre la variable nombre, si la misma es null o con espacio en blanco, se dispara la Excepción mostrando el mensaje indicado.
Existen diferentes tipos de excepciones, para capturar cualquier excepción se debe realizar lo siguiente:
try{ newEval.Nota= float.Parse(nota);WriteLine("La nota de la evaluación ha sido ingresado correctamente");}catch(System.Exception){Printer.WriteTitle("El valor de la nota no es un número válido");WriteLine("Saliendo del programa");}
Excepciones y cascadeo de excepciones
Vamos a crear una interfaz básica de consola que se encargara de crear un objeto Evaluación. Para poder leer lo que el usuario escriba en la consola haremos uso de Console.ReadLine este método nos regresara un string.
Si el usuario ingresa mal la nota de la evaluación el programa va a arrojar un error y terminar su ejecución, para controlar las excepciones usaremos la try catch. Dentro de try va a ir el código que va a ejecutar y en caso de lanzarse una excepción o error va a ejecutarse el código dentro de catch.
Catch va a recibir el tipo de excepción que le indiques, es posible añadir múltiples catch para un try siempre y cuando cada catch reciba un tipo de excepción distinto.
El orden en los catch es importante pues si añades un catch que recibe excepciones genéricas y al final una excepción específica, el programa nunca va a ejecutar el catch de la excepción especifica pues siempre caerá en el catch genérico.
😂🤣😂
No estaba seguro si debía o no dejar el código del reto de la clase pasada en esta clase...pero aquí esta:
Reporteador.cs
...
public IEnumerable<AlumnoPromedio> TopPromedios(string asignatura, int cantidad = 10)
{
var listaPromedios = GetPromedioDeAlumnosPorAsignatura();
var promediosDeAsignatura = listaPromedios[asignatura].Cast<AlumnoPromedio>();
...
var asignaturas = reporteador.GetListaAsignaturas();
foreach (var asignatura in asignaturas)
{
int cantidad = 3;
Printer.WriteTitle($"Top {cantidad} mejores promedios de {asignatura}");
var mejoresPromedios = reporteador.TopPromedios(
asignatura, cantidad);
foreach (var item in mejoresPromedios)
{
Console.WriteLine(item);
} // foreach item in mejoresPromedios
} // foreach asignatura in asignaturas
...
Me encantó esta clase.
el try ayuda mucho pero si se abusa en el uso del try afecta el rendimiento.
Es muy importante saber que podemos manipular el orden en el que vamos cachando los errores.
por otra parte podemos convertir el string a float de una manera más segura:
if(float.TryParse(notaString, out float Nota)){ newEval.Nota=Nota;}
Pregunta que tan aconsejable es utilizar el "goto" ? el siguiente es un ejemplo de como lo utilice
var newEval =newEvaluación(); string nameEval; string NotaEval;try{Printer.WriteTitle("Calificando");NameEvaluacion:WriteLine(" Por favor ingrese el Nombre de la Evaluacion"); nameEval =Console.ReadLine().ToUpperInvariant();if(string.IsNullOrWhiteSpace(nameEval)){WriteLine(" El valor de la evaluación no puede estar vacio"); goto NameEvaluacion;} newEval.Nombre= nameEval;NotaEvaluacion:WriteLine(" Por favor ingrese la Nota de la Evaluacion");NotaEval=Console.ReadLine().ToUpperInvariant();if(string.IsNullOrWhiteSpace(nameEval)){WriteLine(" El valor de la evaluación no puede estar vacio"); goto NotaEvaluacion;}else{ newEval.Nota= float.Parse(NotaEval);if(newEval.Nota<0|| newEval.Nota>5){thrownewArgumentOutOfRangeException("La nota tiene que tener un valor entre '0' y '5'");}}Printer.WriteTitle("Resultado");WriteLine($"Nombre: {newEval.Nombre}, Nota: {newEval.Nota}");}catch(ArgumentOutOfRangeExceptionArgum){WriteLine(Argum.Message.ToString());}catch(Exception exec ){WriteLine($"Valor no valido; {exec}");}