La gestió d'excepcions és una part fonamental de la programació en C#. Les excepcions són errors que es produeixen durant l'execució d'un programa. En aquest tema, aprendrem com manejar aquestes excepcions per evitar que el nostre programa es bloquegi inesperadament.

Conceptes Clau

  1. Excepcions: Errors que es produeixen durant l'execució del programa.
  2. Try-Catch: Blocs de codi utilitzats per capturar i manejar excepcions.
  3. Finally: Bloc de codi que s'executa sempre, independentment de si es produeix una excepció o no.
  4. Throw: Instrucció utilitzada per llançar una excepció.

Try-Catch

El bloc try-catch s'utilitza per capturar excepcions i manejar-les de manera adequada. La sintaxi bàsica és la següent:

try
{
    // Codi que pot produir una excepció
}
catch (Exception ex)
{
    // Codi per manejar l'excepció
    Console.WriteLine(ex.Message);
}

Exemple Pràctic

using System;

class Program
{
    static void Main()
    {
        try
        {
            int[] numbers = { 1, 2, 3 };
            Console.WriteLine(numbers[5]); // Això produirà una excepció
        }
        catch (IndexOutOfRangeException ex)
        {
            Console.WriteLine("S'ha produït una excepció: " + ex.Message);
        }
    }
}

En aquest exemple, intentem accedir a un índex que no existeix en l'array, la qual cosa produeix una excepció IndexOutOfRangeException. El bloc catch captura aquesta excepció i mostra un missatge a la consola.

Finally

El bloc finally s'utilitza per executar codi que ha de córrer independentment de si es produeix una excepció o no. És útil per alliberar recursos, tancar fitxers, etc.

Exemple Pràctic

using System;
using System.IO;

class Program
{
    static void Main()
    {
        StreamReader reader = null;
        try
        {
            reader = new StreamReader("file.txt");
            Console.WriteLine(reader.ReadToEnd());
        }
        catch (FileNotFoundException ex)
        {
            Console.WriteLine("Fitxer no trobat: " + ex.Message);
        }
        finally
        {
            if (reader != null)
            {
                reader.Close();
            }
        }
    }
}

En aquest exemple, el bloc finally s'assegura que el fitxer es tanca, independentment de si es produeix una excepció o no.

Throw

La instrucció throw s'utilitza per llançar una excepció. Això pot ser útil per crear les teves pròpies excepcions personalitzades.

Exemple Pràctic

using System;

class Program
{
    static void Main()
    {
        try
        {
            ValidateAge(15);
        }
        catch (ArgumentException ex)
        {
            Console.WriteLine("Error: " + ex.Message);
        }
    }

    static void ValidateAge(int age)
    {
        if (age < 18)
        {
            throw new ArgumentException("L'edat ha de ser almenys 18.");
        }
    }
}

En aquest exemple, la funció ValidateAge llança una excepció ArgumentException si l'edat és menor de 18.

Exercicis Pràctics

Exercici 1

Escriu un programa que demani a l'usuari que introdueixi dos números i mostri la seva divisió. Utilitza blocs try-catch per manejar possibles excepcions com la divisió per zero.

Solució

using System;

class Program
{
    static void Main()
    {
        try
        {
            Console.Write("Introdueix el primer número: ");
            int num1 = int.Parse(Console.ReadLine());

            Console.Write("Introdueix el segon número: ");
            int num2 = int.Parse(Console.ReadLine());

            int result = num1 / num2;
            Console.WriteLine("El resultat és: " + result);
        }
        catch (DivideByZeroException ex)
        {
            Console.WriteLine("Error: No es pot dividir per zero.");
        }
        catch (FormatException ex)
        {
            Console.WriteLine("Error: Entrada no vàlida.");
        }
    }
}

Exercici 2

Crea una funció que llegeixi un fitxer de text i mostri el seu contingut. Utilitza blocs try-catch-finally per manejar possibles excepcions com FileNotFoundException i assegurar-te que el fitxer es tanca correctament.

Solució

using System;
using System.IO;

class Program
{
    static void Main()
    {
        ReadFile("example.txt");
    }

    static void ReadFile(string filePath)
    {
        StreamReader reader = null;
        try
        {
            reader = new StreamReader(filePath);
            Console.WriteLine(reader.ReadToEnd());
        }
        catch (FileNotFoundException ex)
        {
            Console.WriteLine("Fitxer no trobat: " + ex.Message);
        }
        catch (Exception ex)
        {
            Console.WriteLine("S'ha produït un error: " + ex.Message);
        }
        finally
        {
            if (reader != null)
            {
                reader.Close();
            }
        }
    }
}

Resum

En aquesta secció, hem après com manejar excepcions en C# utilitzant blocs try-catch, finally i la instrucció throw. La gestió d'excepcions és crucial per crear aplicacions robustes i fiables. Hem vist exemples pràctics i hem realitzat exercicis per reforçar els conceptes apresos. Ara estem preparats per avançar al següent tema del curs.

© Copyright 2024. Tots els drets reservats