103 - Excepciones - lanzar una excepción mediante comando throw


Hemos visto hasta ahora cual es la sintaxis para capturar excepciones que lanzan métodos. Ahora veremos como podemos lanzar una excepción para que sea eventualmente capturada posteriormente.

Hay que definir con juicio que métodos de una clase deben lanzar excepciones cuando el dato es incorrecto debido que luego se hace más difícil consumir dicho método.

Aquellas partes críticas de nuestras clases pueden lanzar excepciones para que sean más robustas. Por ejemplo si tenemos una clase 'ClienteBanco' y queremos controlar que nunca pueda sacar más dinero del que tiene depositado, el método extraer puede lanzar una excepción evitando que quede en negativo el monto del cliente.

Problema:

Declarar una clase llamada 'PersonaAdulta' con las propiedades Nombre y Edad. Lanzar una excepción de tipo Exception en caso que llegue en el constructor una edad menor a 18 años, o se intente modificar la propiedad Edad con un valor menor a 18.

En este problema hemos tomado la decisión de validar y lanzar una excepción en caso que se intente la creación de un objeto de la clase PersonaAdulta con una edad inferior a 18. Esto es porque a juicio del programador considera que es muy importante que nunca haya un objeto de tipo PersonaAdulta que sea menor de edad.

Programa:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PruebaExcepcion7
{

    public class PersonaAdulta
    {
        public string Nombre { get; set; }

        private int edad;
        public int Edad
        {
            get
            {
                return edad;
            }
            set
            {
                if (value < 18)
                    throw new Exception($"No es adulta la persona {Nombre} porque tiene {value} años.");
                edad = value;
            }

        }

        public PersonaAdulta(string nombre, int edad)
        {
            Nombre = nombre;
            Edad = edad;
        }

        public void imprimir()
        {
            Console.WriteLine($"{Nombre} - {Edad}");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                PersonaAdulta persona1 = new PersonaAdulta("Ana", 50);
                persona1.imprimir();
                PersonaAdulta persona2 = new PersonaAdulta("Juan", 13);
                persona2.imprimir();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            Console.ReadKey();
        }
    }
}

Para lanzar una excepción debemos utilizar la palabra clave 'throw' y seguidamente la referencia de un objeto de la clase 'Exception' o de una subclase de 'Exception':

                if (value < 18)
                    throw new Exception($"No es adulta la persona {Nombre} porque tiene {value} años.");

Ahora cuando creamos objetos de la clase 'PersonaAdulta' podemos capturar la excepción mediante un bloque try/catch:

        static void Main(string[] args)
        {
            try
            {
                PersonaAdulta persona1 = new PersonaAdulta("Ana", 50);
                persona1.imprimir();
                PersonaAdulta persona2 = new PersonaAdulta("Juan", 13);
                persona2.imprimir();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            Console.ReadKey();
        }

Cuando creamos el objeto 'persona2' se captura la excepción debido que "Juan" tiene 13 años:

C# excepciones throw

Cuando se ejecuta el comando throw no se continúan ejecutando las instrucciones del método, sino que se aborta su ejecución y vuelve al método que lo llamó.

Si cuando creamos un objeto de la clase 'PersonaAdulta' el método Main omite atrapar la excepción, luego se detiene el programa informando la excepción atrapada:

C# excepciones throw

Problemas propuestos

  1. Implementar la clase Operaciones. Debe tener dos propiedades de tipo int. Desarrollar los métodos para calcular su suma, resta, multiplicación y división, imprimir dichos resultados. Lanzar una excepción en el método que calcula la división si el segundo valor es cero.

  2. Declarar una clase 'Cliente' que represente un cliente de un banco. Definir las siguientes propiedades y métodos:

    Cliente		
        Propiedades
            Nombre
            Monto
        métodos
            constructor
            Depositar
            Extraer
            Imprimir
    

    Generar una excepción si se intenta extraer más dinero del que tiene la propiedad 'Monto'.

Solución

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PruebaExcepcion8
{
    public class Operaciones
    {
        public int Valor1 { get; set; }
        public int Valor2 { get; set; }
        public Operaciones(int valor1, int valor2)
        {
            Valor1 = valor1;
            Valor2 = valor2;
        }

        public void Sumar()
        {
            int suma = Valor1 + Valor2;
            Console.WriteLine($"La suma es {suma}");
        }

        public void Restar()
        {
            int resta = Valor1 - Valor2;
            Console.WriteLine($"La resta es {resta}");
        }

        public void Multiplicar()
        {
            int producto = Valor1 * Valor2;
            Console.WriteLine($"El producto es {producto}");
        }

        public void Dividir()
        {
            if (Valor2==0)
                throw new Exception("No se puede dividir por cero");
            int division = Valor1 / Valor2;
            Console.WriteLine($"La división es {division}");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Operaciones operaciones1 = new Operaciones(10, 0);
            operaciones1.Sumar();
            operaciones1.Restar();
            operaciones1.Multiplicar();
            try
            {
                operaciones1.Dividir();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            Console.ReadKey();
        }
    }
}





using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PruebaExcepcion9
{

    public class Cliente
    {
        public string Nombre { get; set; }
        public float Monto { get; set; }

        public Cliente(String nombre, float monto)
        {
            Nombre = nombre;
            Monto = monto;
        }

        public void Depositar(float importe)
        {
            Monto += importe;
        }

        public void Extraer(float importe)
        {
            if (importe > Monto)
                throw new Exception("No se puede extraer más dinero que el depositado.");
            Monto -= importe;
        }
        public void Imprimir()
        {
            Console.WriteLine($"{Nombre} tiene {Monto}");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Cliente cliente1 = new Cliente("Pedro", 10000);
            cliente1.Imprimir();
            cliente1.Depositar(2000);
            cliente1.Imprimir();
            try
            {
                cliente1.Extraer(5000);
                cliente1.Imprimir();
                cliente1.Extraer(3000);
                cliente1.Imprimir();
                cliente1.Extraer(70000);
                cliente1.Imprimir();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            Console.ReadKey();
        }
    }
}

Retornar