No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Excepciones y cascadeo de excepciones

32/35
Recursos

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

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

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

https://thatcsharpguy.com/post/excepciones-c-sharp/

///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 };

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?

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");
}

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>();

        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}"  );
            }