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
- Excepció: Un esdeveniment que interromp el flux normal d'execució d'un programa.
- Llançament d'Excepcions (
throw
): La manera de notificar que ha ocorregut una excepció. - Captura d'Excepcions (
catch
): La manera de manejar una excepció llançada. - 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
- Funció
dividir
: Aquesta funció pren dos entersa
ib
i retorna el resultat de la seva divisió. Sib
és zero, llança una excepció de tipusruntime_error
. - Bloc
try
: En elmain
, intentem cridar la funciódividir
ambx
iy
. - 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.
Curs de Programació en C++
Mòdul 1: Introducció al C++
- Introducció al C++
- Configuració de l'Entorn de Desenvolupament
- Sintaxi i Estructura Bàsica
- Variables i Tipus de Dades
- Entrada i Sortida
Mòdul 2: Estructures de Control
Mòdul 3: Funcions
- Introducció a les Funcions
- Paràmetres de Funció i Tipus de Retorn
- Sobrecàrrega de Funcions
- Recursivitat
Mòdul 4: Arrays i Strings
Mòdul 5: Punteres i Referències
- Introducció als Punteres
- Aritmètica de Punteres
- Punteres i Arrays
- Referències
- Assignació Dinàmica de Memòria
Mòdul 6: Programació Orientada a Objectes
- Introducció a la POO
- Classes i Objectes
- Constructors i Destructors
- Herència
- Polimorfisme
- Encapsulació i Abstracció
Mòdul 7: Temes Avançats
- Plantilles
- Gestió d'Excepcions
- Entrada/Sortida de Fitxers
- Biblioteca de Plantilles Estàndard (STL)
- Expressions Lambda
- Multifil