Este sitio web usa cookies de terceros para analizar el tráfico y personalizar los anuncios. Si no está de acuerdo, abandone el sitio y no siga navegando por él. ×


2.7. Una alternativa para el control errores: las excepciones

La forma "clásica" del control de errores es usar instrucciones "if", que vayan comprobando cada una de los posibles situaciones que pueden dar lugar a un error, a medida que estas situaciones llegan. Esto tiende a hacer el programa más difícil de leer, porque la lógica de la resolución del problema se ve interrumpida por órdenes que no tienen que ver con el problema en sí, sino con las posibles situaciones de error. Por eso, los lenguajes modernos, como C#, permiten una alternativa: el manejo de "excepciones".

La idea es la siguiente: "intentaremos" dar una serie de pasos, y al final de todos ellos indicaremos qué hay que hacer en caso de que alguno no se consiga completar. Esto permite que el programa sea más legible que la alternativa "convencional".

Lo haremos dividiendo el fragmento de programa en dos bloques:

Lo veremos más adelante con más detalle, cuando nuestros programas sean más complejos, especialmente en el manejo de ficheros, pero podemos acercarnos con un primer ejemplo, que intente dividir dos números, e intercepte los posibles errores:

// Ejemplo_02_07a.cs
// Excepciones (1) 
// Introducción a C#, por Nacho Cabanes

using System;

public class Ejemplo_02_07a
{

    public static void Main()
    {
        int numero1, numero2, resultado;

        try 
        {
            Console.WriteLine("Introduzca el primer numero");
            numero1 = Convert.ToInt32( Console.ReadLine() );

            Console.WriteLine("Introduzca el segundo numero");
            numero2 = Convert.ToInt32( Console.ReadLine() );

            resultado = numero1 / numero2;
            Console.WriteLine("Su división es: {0}", resultado);
        } 
        catch (Exception errorEncontrado)
        {
            Console.WriteLine("Ha habido un error: {0}",  
                errorEncontrado.Message);
        }
    }
}

(La variable "errorEncontrado" es de tipo "Exception", y nos sirve para poder acceder a detalles como el mensaje correspondiente a ese tipo de excepción: errorEncontrado.Message)

En este ejemplo, si escribimos un texto en vez de un número, obtendríamos como respuesta

Introduzca el primer numero
hola
Ha habido un error: La cadena de entrada no tiene el formato correcto.

Y si el segundo número es 0, se nos diría

Introduzca el primer numero
3
Introduzca el segundo numero
0
Ha habido un error: Intento de dividir por cero.

Una alternativa más elegante es no "atrapar" todos los posibles errores a la vez, sino uno por uno (con varias sentencias "catch"), para poder tomar distintas acciones, o al menos dar mensajes de error más detallados, así:

// Ejemplo_02_07b.cs
// Excepciones (2) 
// Introducción a C#, por Nacho Cabanes

using System;

public class Ejemplo_02_07b
{
    public static void Main()
    {
        int numero1, numero2, resultado;

        try 
        {
            Console.WriteLine("Introduzca el primer numero");
            numero1 = Convert.ToInt32( Console.ReadLine() );

            Console.WriteLine("Introduzca el segundo numero");
            numero2 = Convert.ToInt32( Console.ReadLine() );

            resultado = numero1 / numero2;
            Console.WriteLine("Su división es: {0}", resultado);
        } 
        
        catch (FormatException)
        {
            Console.WriteLine("No es un número válido");
        }
        catch (DivideByZeroException)
        {
            Console.WriteLine("No se puede dividir entre cero");
        }
    } 
}

Como se ve en este ejemplo, si no vamos a usar detalles adicionales del error que ha afectado al programa, no necesitamos declarar ninguna variable de tipo Exception: nos basta con construcciones como "catch (FormatException)" en vez de "catch (FormatException e)".

¿Y cómo sabemos qué excepciones debemos interceptar? La mejor forma es mirar en la "referencia oficial" para programadores de C#, la MSDN (Microsoft Developer Network): si tecleamos en un buscador de Internet algo como "msdn convert toint32" nos llevará a una página en la que podemos ver que hay dos excepciones que podemos obtener en ese intento de conversión de texto a entero: FormatException (no se ha podido convertir) y OverflowException (número demasiado grande). Otra alternativa más peligrosa es "probar el programa" y ver qué errores obtenemos en pantalla al introducir un valor no válido. Esta alternativa es la menos deseable, porque quizá pasemos por alto algún tipo de error que pueda surgir y que nosotros no hayamos contemplado. En cualquier caso, volveremos a las excepciones más adelante.

Ejercicios propuestos:

Ejercicio propuesto 2.7.1: Crea un programa que pregunte al usuario su edad y su año de nacimiento. Si la edad que introduce no es un número válido, mostrará un mensaje de aviso. Lo mismo ocurrirá si el año de nacimiento no es un número válido.
Ejercicio propuesto 2.7.2: Crea un programa que pregunte al usuario su edad y su año de nacimiento. Si la edad que introduce no es un número válido, mostrará un mensaje de aviso, pero aun así le preguntará su año de nacimiento.