cinco puto cero, jajaja...
Introducción
Todo lo que aprenderás sobre C#
Etapa 5 – POO reutilicemos nuestro código
Reutilizando nuestro Código
Herencia
Polimorfismo
Problemas del polimorfismo
Lista de Objetos polimórfica
Utilizando ToString para mejorar la depuración
Etapa 6- Ajustes y funcionalidad
Implementación de interfaces
Uso de interfaces
Creación y uso de regiones
Etapa 7 – Preparando información para nuestros reportes
Parámetros de salida
Probando funcionalidades de parámetros de salida
Sobrecargas de métodos
Listas de solo Lectura
Diccionario Polimórfico
Implementación de un diccionario
Uso de numeraciones en diccionario
Introduciendo datos en un diccionario
Recorrido de datos en diccionario
Impresión de objetos de un diccionario
Uso de la sentencia switch
Eventos
Recapitulemos
Etapa 8 – Consultas
Creación del reporteador
Extrayendo datos de un diccionario de manera segura
Aprendiendo linq
Sentencia where de linq
Divide y triunfarás
Agrupamientos en linq
Tipos anónimos en consultas linq
Segundo Reto
Etapa 9 – Creando una UI de Consola
Excepciones y cascadeo de excepciones
Sentencia finally
Reto final
Cierre del curso
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Juan Carlos Ruiz
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.
Aportes 18
Preguntas 1
cinco puto cero, jajaja...
También es posible crear excepciones personalizadas usando una clase que herede de Exception.
public class ExcepcionMiguel : Exception
{
public BusinessException(string message)
: base(message)
{
}
}
y para Usarla se puede hacer como con los otros tipos
throw new ExcepcionMiguel("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.
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.
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
public static void WriteError(string msg)
{
Console.ForegroundColor = ConsoleColor.Red;
WriteLine($"Error : {msg}");
Console.ForegroundColor = ConsoleColor.White;
}
public static void PressEnter()
{
WriteLine("Presione ENTER para continuar ...");
}
public static string EnterString(
string msg = "Ingrese un valor :",
string msgValueNull = "El valor ingresado no puede ser vacio"
)
{
string value = "";
//Mostrando mensaje y leyendo el valor ingresado
WriteLine(msg);
PressEnter();
value = ReadLine();
try
{
if (string.IsNullOrEmpty(value))
throw new ArgumentNullException();
}
catch (ArgumentNullException)
{
WriteError(msgValueNull);
EnterString(msg, msgValueNull);
}
catch (Exception ex)
{
WriteError(ex.Message);
EnterString(msg, msgValueNull);
}
return value;
}
public static 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 valor
WriteLine(msg);
PressEnter();
//Recibiendo el valor
valueAsString = ReadLine();
try
{
//Verificando si es null
if (string.IsNullOrEmpty(valueAsString))
throw new ArgumentNullException();
//Convirtiendo
value = float.Parse(valueAsString);
//Verificando si esta fuera del rango
if (value > rangeTop || value < rangeButtom)
throw new ArgumentOutOfRangeException();
}
catch (ArgumentNullException)
{
WriteError(msgValueNull);
//Uso de recursividad para volver a pedir el valor
EnterFloatNumber(msg, msgErrorDef, msgOutRange,
msgValueNull, rangeTop, rangeButtom);
}
catch (ArgumentOutOfRangeException)
{
WriteError(msgOutRange);
//Uso de recursividad para volver a pedir el valor
EnterFloatNumber(msg, msgErrorDef, msgOutRange,
msgValueNull, rangeTop, rangeButtom);
}
catch (Exception)
{
WriteError(msgErrorDef);
//Uso de recursividad para volver a pedir el valor
EnterFloatNumber(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 evaluacion
var newEval = new Evaluacion() { Nombre = _nombre, Nota = _nota };
Como puedo lograr que mi consola acepte la lectura del punto**(.)** y de la coma**(,)** por 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))
{
throw new ArgumentException("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");
}
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>();
return promediosDeAsignatura
.OrderByDescending(x => x.Promedio)
.Take(cantidad);
} // TopPromedios(asignatura, cantidad)
…
Program.cs
…
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 = new Evaluació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 ){
throw new ArgumentOutOfRangeException("La nota tiene que tener un valor entre '0' y '5'");
}
}
Printer.WriteTitle("Resultado");
WriteLine($"Nombre: {newEval.Nombre}, Nota: {newEval.Nota}");
}
catch (ArgumentOutOfRangeException Argum)
{
WriteLine(Argum.Message.ToString());
}
catch (Exception exec )
{
WriteLine($"Valor no valido; {exec}" );
}
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?