Le processus de gestion des exceptions en C++ est le suivant : lorsqu'une exception se produit lors de l'exécution du programme, elle n'a pas besoin d'être gérée dans cette fonction. Au lieu de cela, un message d'erreur est généré et transmis à la fonction de niveau supérieur. pour la résolution. Le niveau supérieur le résout. S'il échoue, il sera transmis au niveau supérieur pour traitement. En téléchargeant de cette manière étape par étape, s'il ne peut pas être traité jusqu'au niveau le plus élevé, le système en cours d'exécution appellera automatiquement la fonction système Terminer,
Apprendre à utiliser la fonction Terminer peut aider à la gestion des exceptions
Be a La fonction de terminaison est appelée lorsqu'une exception se produit Code :
[cpp] view plaincopyprint? #include <iostream> #include <exception> using namespace std; void on_terminate(){ cout<<"terninate function called!"<<endl; cin.get(); } int main(void){ set_terminate(on_terminate); throw exception(); cout<<"terminate function not called!"<<endl; cin.get(); return 0; }
La situation dans laquelle la terminaison est appelée :
1 Lors de l'envoi d'une Exception, et le constructeur génère une exception
2 Lorsqu'une exception est envoyée, ou le destructeur génère une exception
3 La construction ou la destruction d'un objet statique envoie une exception
🎜>4 Lorsqu'une exception se produit dans une fonction enregistrée avec atexit
5 Lors de la personnalisation d'une exception, mais aucune exception ne se produit réellement
6 Lors de l'appel de la fonction par défaut unexceptiond()
Exemple :
[cpp] view plaincopyprint? #include <iostream> #include <exception> using namespace std; void on_terminate(){ cout<<"terminate function called!"<<endl; cin.get(); } class custom_exception{ custom_exception(){ } custom_exception(const custom_exception& excep){ throw exception(); } }; void case_1(){ try{ throw custom_exception(); } catch(...){ } }
Lorsqu'une fonction lève une exception de lancement, si la fonction construit un objet en interne, le système appellera d'abord le destructeur de l'objet. Une fois que l'objet aura appelé le destructeur, il commencera à lancer l'exception. .
En même temps, parmi les exceptions des classes avec des relations d'héritage, les exceptions de la sous-classe doivent être placées au début, et les exceptions de la classe de base doivent être placées au début end, afin que les exceptions de la sous-classe puissent être traitées en premier et les exceptions de la classe parent en dernier.
[cpp] view plaincopyprint? #include<iostream> using namespace std; class X { public: class Trouble {}; //注意:类中嵌套类的申明和定义,学习!!! class small: public Trouble {}; class big:public Trouble {};//类中的继承!!! void f(){ throw big(); } }; int main() { X x; try{ x.f(); } catch(X::Trouble &) { cout<<"caught Trouble"<<endl; } catch(X::small&) { cout<<"caught small"<<endl; } catch(X::big&) { cout<<"caught big"<<endl; } return 0; }
Si tel est le cas, l'exception de type big() levée sera monopolisée par la classe trouble. Vous devez l'écrire à l'envers pour capturer toutes les exceptions de manière séquentielle. utiliser... Toutes les exceptions peuvent être interceptées, mais celles-ci doivent être placées à la fin.
Le gestionnaire d'exceptions Ellipse n'est autorisé à accepter aucun paramètre, il est donc impossible d'obtenir des informations sur l'exception, et il est impossible de connaître le type d'exception. L'instruction catch est souvent utilisée pour nettoyer les ressources et relancer l'exception capturée.
Recommandations associées :
Exemple d'utilisation de la gestion des exceptions
Solution à l'exception de passerelle incorrecte 502 dans nginx+php-fpm
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!