C++ Gestion des exceptions : essayer, attraper, lancer un exemple

โšก Rรฉsumรฉ intelligent

Gestion des exceptions dans C++ Ce mรฉcanisme permet ร  un programme de dรฉtecter et de gรฉrer les erreurs d'exรฉcution ร  l'aide des blocs try, catch et throw, afin d'รฉviter son plantage. Vous dรฉcouvrirez ici les mots-clรฉs, la syntaxe, les exceptions standard et les exceptions personnalisรฉes, illustrรฉes par des exemples.

  • โš ๏ธ Qu'est-ce que c'est: La gestion des exceptions permet de dรฉtecter les erreurs d'exรฉcution afin qu'un programme puisse se rรฉtablir.
  • (I.e. Mots clรฉs: Il utilise try pour tester le code, throw pour lever des erreurs et catch pour gรฉrer les erreurs.
  • ๐Ÿงพ syntaxe: Placez le code risquรฉ dans un bloc try et gรฉrez les erreurs dans des blocs catch.
  • ๐Ÿ“š Exceptions standard : C++ fournit des exceptions intรฉgrรฉes dans l'en-tรชte d'exception.
  • ๐Ÿค– Aide de l'IA : Les outils d'IA comme GitHub Copilot ajoutent des blocs try-catch et une gestion des erreurs.

C++ Gestion des exceptions

Qu'est-ce que la gestion des exceptions dans C++?

Gestion des exceptions dans C++ vous offre un moyen de gรฉrer des circonstances inattendues telles que des erreurs d'exรฉcution. Ainsi, chaque fois qu'une circonstance inattendue se produit, le contrรดle du programme est transfรฉrรฉ ร  des fonctions spรฉciales appelรฉes gestionnaires.

Pour dรฉtecter les exceptions, vous placez une section de code sous inspection des exceptions. La section de code est placรฉe dans le bloc try-catch.

Si une situation exceptionnelle se produit dans cette section de code, une exception sera levรฉe. Ensuite, le gestionnaire d'exceptions prendra le contrรดle du programme.

Si aucune circonstance exceptionnelle ne se produit, le code sโ€™exรฉcutera normalement. Les gestionnaires seront ignorรฉs.

Dans ce nouvel article concernant notre nouveau projet C++ tutoriel, vous apprendrez :

Pourquoi la gestion des exceptions ?

Voici la raison de l'utilisation de la gestion des exceptions dans C++:

  • Vous sรฉparerez votre code de gestion des erreurs de votre code normal. Le code sera plus lisible et plus facile ร  maintenir.
  • Les fonctions peuvent gรฉrer les exceptions de leur choix. Mรชme si une fonction gรฉnรจre de nombreuses exceptions, elle nโ€™en gรฉrera que quelques-unes. L'appelant gรฉrera les exceptions non interceptรฉes.

Mots-clรฉs de gestion des exceptions

Gestion des exceptions dans C++ s'articule autour de ces trois mots clรฉs :

  • renversementโ€“ lorsqu'un programme rencontre un problรจme, il lรจve une exception. Le mot-clรฉ throw aide le programme ร  effectuer le lancement.
  • captureโ€“ un programme utilise un gestionnaire d'exceptions pour intercepter une exception. Il est ajoutรฉ ร  la section d'un programme dans laquelle vous devez gรฉrer le problรจme. Cela se fait en utilisant le mot-clรฉ catch.
  • Essaiโ€“ le bloc try identifie le bloc de code pour lequel certaines exceptions seront activรฉes. Il doit รชtre suivi d'un ou plusieurs blocs catch.

Supposons qu'un bloc de code dรฉclenche une exception. L'exception sera interceptรฉe par une mรฉthode utilisant des mots-clรฉs try et catch. Le bloc try/catch doit entourer le code susceptible de lever une exception. Un tel code est appelรฉ code protรฉgรฉ.

Syntaxe

Le try/catch prend cette syntaxe :

try {
   // the protected code
} catch( Exception_Name exception1 ) {
   // catch block
} catch( Exception_Name exception2 ) {
   // catch block
} catch( Exception_Name exceptionN ) {
   // catch block
}
  • Bien que nous ayons une seule instruction try, nous pouvons avoir plusieurs instructions catch.
  • ExceptionName est le nom de l'exception ร  intercepter.
  • exception1, exception2 et exceptionN sont vos noms dรฉfinis pour faire rรฉfรฉrence aux exceptions.

Exemple 1:

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

int main() {
	vector<int> vec;
	vec.push_back(0);	
	vec.push_back(1);	
	// access the third element, which doesn't exist
	try
	{
		vec.at(2);		
	}
	catch (exception& ex)
	{
		cout << "Exception occurred!" << endl;
	}
	return 0;
}

Sortie :

Mots-clรฉs de gestion des exceptions

Voici une capture d'รฉcran du code :

Mots-clรฉs de gestion des exceptions

Code Explication:

  1. Incluez le fichier d'en-tรชte iostream dans le programme pour utiliser son fonctions.
  2. Incluez le fichier d'en-tรชte vectoriel dans le programme pour utiliser ses fonctions.
  3. Incluez l'espace de noms std du programme dans ses classes sans l'appeler.
  4. Appelez la fonction main(). La logique du programme doit รชtre ajoutรฉe dans son corps.
  5. Crรฉez un vecteur nommรฉ vec pour stocker des donnรฉes entiรจres.
  6. Ajoutez l'รฉlรฉment 0 au vecteur nommรฉ vec.
  7. Ajoutez l'รฉlรฉment 1 au vecteur nommรฉ vec.
  8. Un commentaire. Il sera ignorรฉ par le C++ compilateur.
  9. Utilisez l'instruction try pour intercepter une exception. Le { marque le dรฉbut du corps du bloc try/catch. Le code ajoutรฉ dans le corps deviendra le code protรฉgรฉ.
  10. Essayez d'accรฉder ร  l'รฉlรฉment stockรฉ ร  l'index 2 (troisiรจme รฉlรฉment) du vecteur nommรฉ vec. Cet รฉlรฉment n'existe pas.
  11. Fin du corps du bloc try/catch.
  12. Attrapez l'exception. Le message d'erreur renvoyรฉ sera stockรฉ dans la variable ex.
  13. Imprimez un message sur la console si l'exception est interceptรฉe.
  14. Extrรฉmitรฉ du corps du bloc de capture.
  15. Le programme doit renvoyer une valeur en cas d'exรฉcution rรฉussie.
  16. Fin du corps de la fonction main().

Exemple 2:

#include <iostream>
using namespace std;
double zeroDivision(int x, int y) {

	if (y == 0) {
		throw "Division by Zero!";
	}
	return (x / y);
}

int main() {
	int a = 11;
	int b = 0;
	double c = 0;

	try {
		c = zeroDivision(a, b);
		cout << c << endl;
	}
	catch (const char* message) {
		cerr << message << endl;
	}
	return 0;
}

Sortie :

Mots-clรฉs de gestion des exceptions

Voici une capture d'รฉcran du code :

Mots-clรฉs de gestion des exceptions

Code Explication:

  1. Incluez le fichier d'en-tรชte iostream dans le programme pour utiliser ses fonctions.
  2. Incluez l'espace de noms std du programme dans ses classes sans l'appeler.
  3. Crรฉez une fonction nommรฉe zeroDivision qui prend deux arguments entiers, x et y. La fonction doit renvoyer un rรฉsultat double.
  4. Utilisez une instruction if pour vรฉrifier si la valeur de l'argument variable y est 0. Le { marque le dรฉbut du corps if.
  5. Le message ร  renvoyer/lancer si y est 0.
  6. Fin du corps de l'instruction if.
  7. La fonction zeroDivision doit renvoyer la valeur de x/y.
  8. Fin du corps de la fonction zeroDivision.
  9. Appelez la mรฉthode main(). Le { marque le dรฉbut de cette mรฉthode.
  10. Dรฉclarez une variable entiรจre et attribuez-lui la valeur 11.
  11. Dรฉclarez une variable entiรจre b et attribuez-lui la valeur 0.
  12. Dรฉclarez une variable double c et attribuez-lui la valeur 0.
  13. Utilisez l'instruction try pour intercepter une exception. Le { marque le dรฉbut du corps du bloc try/catch. Le code ajoutรฉ dans le corps deviendra le code protรฉgรฉ.
  14. Appelez la fonction zeroDivision et passez aux arguments a et b, c'est-ร -dire 11 et 0. Le rรฉsultat de cette opรฉration sera stockรฉ dans la variable c.
  15. Imprimez la valeur de la variable c sur la console.
  16. Fin du corps du bloc try/catch.
  17. Attrapez l'exception. Le message d'erreur renvoyรฉ sera stockรฉ dans le message variable.
  18. Imprimez le message d'erreur renvoyรฉ sur la console.
  19. Extrรฉmitรฉ du corps du bloc de capture.
  20. Le programme doit renvoyer une valeur en cas d'exรฉcution rรฉussie.
  21. Fin du corps de la fonction main().

C++ Exceptions standards

C++ Exceptions standards

C++ est livrรฉ avec une liste d'exceptions standard dรฉfinies dans classe. Ceux-ci sont dรฉcrits ci-dessous :

Exception Description
std :: exception Ceci est une exception et la classe parent de tous les standards C++ des exceptions.
std :: bad_alloc Cette exception est levรฉe par un nouveau mot-clรฉ.
std :: bad_cast Il s'agit d'une exception levรฉe par Dynamic_cast.
std :: mauvaise_exception Un dispositif utile pour gรฉrer les exceptions inattendues dans C++ programmes.
std :: bad_typeid Une exception levรฉe par typeid.
std :: erreur_logique Cette exception est thรฉoriquement dรฉtectable par la lecture du code.
std ::domain_error Il s'agit d'une exception levรฉe aprรจs l'utilisation d'un domaine mathรฉmatiquement invalide.
std :: invalid_argument Une exception levรฉe pour l'utilisation d'arguments non valides.
std :: longueur_erreur Une exception levรฉe aprรจs la crรฉation d'un gros std::string.
std :: out_of_range Jetรฉ par la mรฉthode.
std :: runtime_error Il s'agit d'une exception qui ne peut pas รชtre dรฉtectรฉe via la lecture du code.
std :: overflow_error Cette exception est levรฉe aprรจs l'apparition d'un dรฉbordement mathรฉmatique.
std :: range_error Cette exception est levรฉe lorsque vous tentez de stocker une valeur hors plage.
std :: underflow_error Exception levรฉe aprรจs lโ€™apparition dโ€™un dรฉbordement mathรฉmatique.

Exceptions dรฉfinies par l'utilisateur

Le C++ La classe std::exception nous permet de dรฉfinir des objets qui peuvent รชtre lancรฉs comme exceptions. Cette classe a รฉtรฉ dรฉfinie dans le en-tรชte. La classe nous fournit une fonction membre virtuelle nommรฉe quoi.

Cette fonction renvoie une sรฉquence de caractรจres terminรฉe par un caractรจre nul de type char *. Nous pouvons l'รฉcraser dans les classes dรฉrivรฉes pour avoir une description d'exception.

Exemple :

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

class newException : public exception
{
	virtual const char* what() const throw()
	{
		return "newException occurred";
	}
} newex;

int main() {

	try {
		throw newex;
		}
	catch (exception& ex) {
		cout << ex.what() << '\n';
	}
	return 0;	
}

Sortie :

Exceptions dรฉfinies par l'utilisateur

Voici une capture d'รฉcran du code :

Exceptions dรฉfinies par l'utilisateur

Code Explication:

  1. Incluez le fichier d'en-tรชte iostream dans notre programme. Nous utiliserons ses fonctions sans obtenir d'erreurs.
  2. Incluez le fichier d'en-tรชte d'exception dans notre programme. On utilisera ses fonctions comme quoi sans erreurs.
  3. Incluez l'espace de noms std dans notre programme pour utiliser ses classes sans l'appeler.
  4. Crรฉez une nouvelle classe nommรฉe newException. Cette classe hรฉrite de la classe d'exception de C++.
  5. Le dรฉbut du corps de classe.
  6. Remplacez la fonction membre virtuelle what() dรฉfinie dans le fichier d'en-tรชte d'exception. Nous dรฉcrirons ensuite notre propre exception, la nouvelle exception.
  7. Commencez la dรฉfinition de la nouvelle exception.
  8. Message ร  renvoyer si la nouvelle exception est interceptรฉe.
  9. Fin de la dรฉfinition de la nouvelle exception.
  10. Fin du corps de la classe newException. Le newex est le nom ร  utiliser pour intercepter notre nouvelle exception, aprรจs quoi la newException sera appelรฉe.
  11. Appelez la fonction main(). La logique du programme doit รชtre ajoutรฉe dans son corps. Le { marque le dรฉbut de son corps.
  12. Utilisez une instruction try pour marquer le code dans lequel nous devons marquer l'exception. Le { marque le dรฉbut du corps du bloc try/catch. Le code entourรฉ par ceci sera protรฉgรฉ.
  13. Lancez l'exception newex si elle est interceptรฉe.
  14. Fin du corps d'essai.
  15. Utilisez l'instruction catch pour intercepter l'exception. Le message d'erreur d'exception sera stockรฉ dans la variable ex.
  16. Imprimez le message d'erreur d'exception sur la console.
  17. Fin du corps de l'instruction catch.
  18. Le programme doit renvoyer une valeur s'il s'exรฉcute avec succรจs.
  19. Fin du corps de la fonction main().

FAQ

La gestion des exceptions est un moyen de dรฉtecter et de rรฉpondre aux erreurs d'exรฉcution. C++ en utilisant les mots-clรฉs try, throw et catch, afin que le programme puisse rรฉcupรฉrer au lieu de planter.

C++ utilise trois mots-clรฉs : try enveloppe le code susceptible dโ€™รฉchouer, throw lรจve une exception en cas dโ€™erreur et catch gรจre lโ€™exception levรฉe.

Placez le code risquรฉ dans un bloc try, puis faites-le suivre d'un ou plusieurs blocs catch qui gรจrent chacun un type d'exception spรฉcifique levรฉe par le bloc try.

Les exceptions standard sont des classes d'exceptions intรฉgrรฉes dans l'en-tรชte d'exception, telles que std::bad_alloc et std::out_of_range, qui signalent les erreurs d'exรฉcution courantes.

Une exception dรฉfinie par l'utilisateur est une classe personnalisรฉe, souvent dรฉrivรฉe de std::exception, qui remplace la fonction what() pour dรฉcrire votre propre condition d'erreur spรฉcifique.

Les assistants IA comme GitHub Copilot encapsulent le code risquรฉ dans des blocs try-catch, gรฉnรจrent des classes d'exceptions personnalisรฉes et suggรจrent les exceptions ร  intercepter au fur et ร  mesure de la saisie.

Oui. Les outils basรฉs sur l'IA repรจrent les exceptions non gรฉrรฉes, suggรจrent des blocs catch spรฉcifiques plutรดt que gรฉnรฉriques et ajoutent des messages d'erreur pertinents, ce qui simplifie votre C++ Un code plus robuste.

La fonction throw lรจve une exception lorsqu'une erreur est dรฉtectรฉe, tandis que la fonction catch reรงoit cette exception et exรฉcute le code qui gรจre ou signale l'erreur.

Rรฉsumez cet article avec :