100 - Excepciones - múltiples catch para un try


Podemos definir varios bloques catch para un solo bloque try. Es común que en un bloque try haya más de un método que pueda elevar excepciones o inclusive un mismo método puede generar más de un tipo de excepción.

Luego podemos disponer una sintaxis de try/catch:

try {
  [instrucciones 1]
} catch([excepción 1]) {
  [instrucciones 2]
}
catch([excepción 2]) {
  [instrucciones 3]
}
catch([excepción n]) {
  [instrucciones n]
}

Problema:

Realizar la carga de 2 enteros por teclado, mostrar el resultado de dividir el primero por el segundo.

Programa:

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

namespace PruebaExcepcion2
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Console.Write("Ingrese primer valor:");
                var num1 = int.Parse(Console.ReadLine());
                Console.Write("Ingrese segundo valor:");
                var num2 = int.Parse(Console.ReadLine());
                var resu = num1 / num2;
                Console.WriteLine($"La división de {num1} respecto a {num2} es {resu}");
            }
            catch(FormatException e)
            {
                Console.Write("Debe ingresar obligatoriamente números enteros.");
            }
            catch(DivideByZeroException e)
            {
                Console.Write("No se puede dividir por cero");
            }
            Console.ReadKey();
        }
    }
}

El bloque try implementa la captura de la excepción 'FormatException' que puede suceder en cualquiera de las dos llamadas al método 'Parse' de la clase int.
También implementa la captura de la excepción 'DivideByZeroException' que sucede si en la línea siguiente la variable num2 almacena un cero:

                var resu = num1 / num2;

Problema:

Confeccionar una aplicación visual de tipo 'Windows Form' que permita ingresar en controles de tipo TextBox dos valores enteros. Al presionar un botón mostrar la división del primero respecto al segundo en el título del JFrame o un mensaje si no se ingresan datos o la división no se puede efectuar.

Programa:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace PruebaExcepcion3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Button1_Click(object sender, EventArgs e)
        {
            try
            {
                var num1 = int.Parse(textBox1.Text);
                var num2 = int.Parse(textBox2.Text);
                var resu = num1 / num2;
                Text=$"La división de {num1} respecto a {num2} es {resu}";
            }
            catch (FormatException ex)
            {
                Text="Debe ingresar obligatoriamente números enteros.";
            }
            catch (DivideByZeroException ex)
            {
                Text="No se puede dividir por cero";
            }
        }
    }
}

Cuando se presiona el botón se ejecuta el método 'Button1_Click' donde recuperamos y transformamos a entero los dos datos ingresados en los controles TextBox:

                var num1 = int.Parse(textBox1.Text);
                var num2 = int.Parse(textBox2.Text);

Abrimos un bloque try donde verificaremos excepciones de tipo 'FormatException' que son disparadas por el método estático 'Parse' de la clase int. Esto sucede si la propiedad Text del TextBox no contiene un valor entero.

De forma similar al problema anterior capturamos si hay una excepción de intentar la división por cero:

            try
            {
                var num1 = int.Parse(textBox1.Text);
                var num2 = int.Parse(textBox2.Text);
                var resu = num1 / num2;
                Text=$"La división de {num1} respecto a {num2} es {resu}";
            }
            catch (FormatException ex)
            {
                Text="Debe ingresar obligatoriamente números enteros.";
            }
            catch (DivideByZeroException ex)
            {
                Text="No se puede dividir por cero";
            }

Si ejecutamos la aplicación e ingresamos en alguno de los dos controles de tipo TextBox que no sean numéricos, al presionar el botón se nos informa del problema en lugar de detenerse el programa con una excepción:

C# excepciones captura

De forma similar se dispara la excepción DivideByZeroException si ingresamos el segundo TextBox el valor cero.

El bloque catch requiere en forma obligatoria las llaves de apertura y cerrado.

            catch (FormatException ex)
            {
                Text="Debe ingresar obligatoriamente números enteros.";
            }
            catch (DivideByZeroException ex)
            {
                Text="No se puede dividir por cero";
            }

Problema:

Declarar un vector de 10 elementos enteros. Permitir que el usuario ingrese un subíndice del vector y nos muestre el contenido de dicha componente. Atrapar las excepciones de fuera de rango del vector y si ingresa un valor no entero.

Programa:

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

namespace PruebaExcepcion4
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] vec = { 20, 45, 76, 81, 34, 567, 423, 6, 3, 5 };
            try
            {
                Console.Write("Ingrese un valor entre 0 y 9:");
                var indice = int.Parse(Console.ReadLine());
                Console.WriteLine($"En el vector se almacena en la posición {indice} el valor {vec[indice]}");
            }
            catch (FormatException e)
            {
                Console.Write("Debe ingresar obligatoriamente números enteros.");
            }
            catch (IndexOutOfRangeException e)
            {
                Console.Write("El valor debe estar entre 0 y 9");
            }
            Console.ReadKey();
        }
    }
}

La excepción 'IndexOutOfRangeException' se dispara cuando intentamos acceder a una componente inexistente de un vector (por ejemplo ingresamos un 15 en la variable 'indice'):

                Console.WriteLine($"En el vector se almacena en la posición {indice} el valor {vec[indice]}");

Retornar