Maison > Article > développement back-end > Méthodes de gestion des exceptions C++
gestion des exceptions c++
Les programmes rencontrent souvent des situations anormales lors de leur exécution, par exemple : le diviseur lors de la division est 0 ; l'utilisateur a saisi un nombre négatif lors de la saisie de l'âge ; lors de l'utilisation de l'opérateur new pour allouer dynamiquement de l'espace, il n'y a pas assez d'espace à allouer lors de l'accès aux éléments du tableau, l'indice est hors limites lors de l'ouverture d'un fichier en lecture ; le fichier n'existe pas, etc.
Ces situations anormales, si elles ne sont pas découvertes et traitées, sont susceptibles de provoquer le crash du programme.
Le soi-disant « traitement » peut signifier donner un message d'erreur puis permettre au programme de continuer à s'exécuter sur un chemin sans erreur ; cela peut également signifier devoir terminer le programme, mais effectuer un travail nécessaire avant ; fin. Comme écrire des données en mémoire dans des fichiers, fermer des fichiers ouverts, libérer de l'espace mémoire alloué dynamiquement, etc.
C++ introduit un mécanisme de gestion des exceptions. L'idée de base est la suivante : lorsque la fonction A trouve une exception lors de l'exécution, elle ne peut pas la gérer, mais simplement "lancer une exception" à l'appelant de A, supposé être la fonction B.
Lancer une exception sans la gérer entraînera la fin immédiate de la fonction A. Dans ce cas, la fonction B peut choisir d'intercepter l'exception lancée par A et de la gérer, ou elle peut choisir de l'ignorer. Si elle est ignorée, l'exception sera renvoyée à l'appelant de B, et ainsi de suite.
Si les fonctions de chaque niveau ne gèrent pas les exceptions, l'exception sera finalement renvoyée à la fonction principale la plus externe. La fonction principale doit gérer les exceptions. Si la fonction principale ne gère pas l’exception, le programme se terminera anormalement immédiatement.
Syntaxe de base pour la gestion des exceptions C++
C++ gère les exceptions via des instructions throw et des instructions try...catch. La syntaxe de l'instruction throw est la suivante :
throw 表达式;
Cette instruction lève une exception. Une exception est une expression dont le type valeur peut être un type primitif ou une classe. Il peut y avoir plusieurs
try...catch 语句的语法如下: try { 语句组 }catch(异常类型) { 异常处理代码 }...catch(异常类型) { 异常处理代码 }
prises, mais il doit y avoir au moins une de .
Vous pourriez aussi bien appeler try et le contenu dans {} comme un "bloc try", et appeler catch et le contenu dans {} comme un "bloc catch"
essayer... Le processus d'exécution de l'instruction catch est le suivant : exécuter les instructions dans le bloc try. Si aucune exception n'est levée pendant l'exécution, alors les instructions suivant le dernier bloc catch seront exécutées après l'exécution, et toutes les instructions du bloc catch ne le seront pas. être exécuté ; Si une exception est levée pendant l'exécution du bloc try, alors immédiatement après que l'exception soit levée, elle passe au premier bloc catch dont le "type d'exception" correspond au type d'exception lancé pour l'exécution (on dit que l'exception est "attrapé" par le bloc catch "), après exécution, passez à la fin du dernier bloc catch pour continuer l'exécution.
Par exemple, le programme suivant :
#include <iostream> using namespace std; int main() { double m ,n; cin >> m >> n; try { cout << "before dividing." << endl; if( n == 0) throw -1; //抛出int类型异常 else cout << m / n << endl; cout << "after dividing." << endl; } catch(double d) { cout << "catch(double) " << d << endl; } catch(int e) { cout << "catch(int) " << e << endl; } cout << "finished" << endl; return 0; }
Le résultat d'exécution du programme est le suivant :
9 6↙ before dividing. 1.5 after dividing. finished
Explication que lorsque n n'est pas 0, aucune exception sera jeté dans le bloc try . Par conséquent, une fois le bloc try exécuté normalement, le programme continue son exécution au-delà de tous les blocs catch et aucun des blocs catch ne sera exécuté.
Le résultat d'exécution du programme peut également être le suivant :
9 0↙ before dividing. catch\(int) -1 finished
Lorsque n vaut 0, une exception entière sera levée dans le bloc try. Après qu’une exception soit levée, le bloc try arrête immédiatement l’exécution. L'exception entière sera interceptée par le premier bloc catch de type correspondant, c'est-à-dire qu'elle entrera dans le bloc catch(int e) pour exécution. Une fois le bloc catch exécuté, le programme continuera à s'exécuter jusqu'à ce qu'il se termine normalement.
Si l'exception levée n'est pas interceptée par le bloc catch, par exemple, remplacez catch(int e) par catch(char e), lorsque l'entrée n est 0, l'exception entière levée ne le sera pas. Le bloc catch peut l'attraper, l'exception ne sera pas gérée, alors le programme se terminera immédiatement et le contenu après try...catch ne sera pas exécuté.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!