La gestió d'excepcions és una característica essencial en C++ que permet als programadors manejar errors i situacions excepcionals de manera controlada. En aquest tema, aprendrem com utilitzar les estructures try, catch i throw per gestionar les excepcions en els nostres programes.

Conceptes Clau

  1. Excepció: Un esdeveniment que interromp el flux normal d'execució d'un programa.
  2. Llançament d'Excepcions (throw): La manera de notificar que ha ocorregut una excepció.
  3. Captura d'Excepcions (catch): La manera de manejar una excepció llançada.
  4. Blocs try: Blocs de codi on es poden produir excepcions.

Estructura Bàsica

La gestió d'excepcions en C++ es fa mitjançant tres paraules clau: try, catch i throw.

try {
    // Codi que pot llançar una excepció
    throw excepció;
} catch (tipus_excepció &e) {
    // Codi per manejar l'excepció
}

Exemple Pràctic

Vegem un exemple pràctic per entendre millor com funciona la gestió d'excepcions.

#include <iostream>
using namespace std;

int dividir(int a, int b) {
    if (b == 0) {
        throw runtime_error("Divisió per zero no permesa");
    }
    return a / b;
}

int main() {
    int x = 10;
    int y = 0;
    try {
        int resultat = dividir(x, y);
        cout << "Resultat: " << resultat << endl;
    } catch (const runtime_error &e) {
        cout << "Error: " << e.what() << endl;
    }
    return 0;
}

Explicació del Codi

  1. Funció dividir: Aquesta funció pren dos enters a i b i retorna el resultat de la seva divisió. Si b és zero, llança una excepció de tipus runtime_error.
  2. Bloc try: En el main, intentem cridar la funció dividir amb x i y.
  3. Bloc catch: Si es llança una excepció, es captura i es maneja imprimint un missatge d'error.

Tipus d'Excepcions

C++ permet llançar i capturar diferents tipus d'excepcions. Alguns dels tipus més comuns són:

  • std::exception: La classe base per a totes les excepcions estàndard.
  • std::runtime_error: Utilitzada per errors que es poden detectar només en temps d'execució.
  • std::logic_error: Utilitzada per errors lògics que es poden detectar en temps de compilació.

Exemple amb Diversos Tipus d'Excepcions

#include <iostream>
#include <stdexcept>
using namespace std;

void funcio(int x) {
    if (x == 0) {
        throw runtime_error("Error de temps d'execució");
    } else if (x < 0) {
        throw logic_error("Error lògic");
    }
}

int main() {
    try {
        funcio(0);
    } catch (const runtime_error &e) {
        cout << "Runtime error: " << e.what() << endl;
    } catch (const logic_error &e) {
        cout << "Logic error: " << e.what() << endl;
    }
    return 0;
}

Exercicis Pràctics

Exercici 1

Escriu una funció que llegeixi un enter des de l'entrada estàndard i llanci una excepció si el nombre és negatiu. Captura l'excepció i imprimeix un missatge d'error.

Solució

#include <iostream>
#include <stdexcept>
using namespace std;

void llegirNombre() {
    int nombre;
    cout << "Introdueix un nombre: ";
    cin >> nombre;
    if (nombre < 0) {
        throw invalid_argument("Nombre negatiu no permès");
    }
    cout << "Has introduït: " << nombre << endl;
}

int main() {
    try {
        llegirNombre();
    } catch (const invalid_argument &e) {
        cout << "Error: " << e.what() << endl;
    }
    return 0;
}

Exercici 2

Modifica l'exercici anterior per capturar qualsevol tipus d'excepció i imprimir un missatge genèric d'error.

Solució

#include <iostream>
#include <stdexcept>
using namespace std;

void llegirNombre() {
    int nombre;
    cout << "Introdueix un nombre: ";
    cin >> nombre;
    if (nombre < 0) {
        throw invalid_argument("Nombre negatiu no permès");
    }
    cout << "Has introduït: " << nombre << endl;
}

int main() {
    try {
        llegirNombre();
    } catch (...) {
        cout << "S'ha produït un error" << endl;
    }
    return 0;
}

Resum

En aquesta secció, hem après els conceptes bàsics de la gestió d'excepcions en C++. Hem vist com utilitzar les estructures try, catch i throw per manejar errors i situacions excepcionals. També hem explorat diferents tipus d'excepcions i hem practicat amb exemples i exercicis pràctics. La gestió d'excepcions és una eina poderosa que ens permet escriure codi més robust i fiable.

© Copyright 2024. Tots els drets reservats