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 entersaibi 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ódividirambxiy. - 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
