2010-12-06 29 views
7

Puis-je implémenter la gestion des exceptions globales en C++? Mon exigence est try ... catch block n'est pas utilisé dans un morceau de code alors il devrait y avoir un gestionnaire d'exception global qui gérera toutes les exceptions non interceptées.Gestion des exceptions globales en C++

Puis-je réaliser, s'il vous plaît donner votre précieuse suggestion :)

+3

Il n'y a aucun try ... catch bloque en C de toute façon. Pensez-vous à C++ peut-être? –

+0

Merci Karl, je l'ai changé en C++. –

+0

Ce fil de discussion MSDN pourrait fournir quelques liens utiles: http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/99cbe120-d8a9-448f-b827-8b61ca0a6a27 –

Répondre

1

vous pouvez utiliser une combinaison de set_terminate et current_exception()

4

En C++ la fonction terminate est appelée lorsqu'une exception est non détectée. Vous pouvez installer votre propre gestionnaire de terminaison avec la fonction set_terminate. L'inconvénient est que votre gestionnaire de terminaison ne peut jamais revenir; il doit terminer votre programme avec une primitive de système d'exploitation. La valeur par défaut est simplement d'appeler abort()

+2

désolé mais je suis un programmeur C#. Donc, si vous pouvez donner un échantillon de code pour qu'il puisse m'aider. Merci d'avance :) –

0

Lorsqu'une exception est déclenchée, si elle n'est pas détectée à ce moment, elle remonte dans la hiérarchie jusqu'à ce qu'elle soit réellement interceptée. S'il n'y a pas de code pour gérer l'exception, le programme se termine.
Vous pouvez exécuter du code spécifique avant la fin de faire le nettoyage en utilisant vos propres gestionnaires de set_unexpected ou set_terminate

+0

Pour ceci et toutes les autres réponses à propos de set_terminate: si l'exception n'est pas gérée dans le bloc catch, le processus sera toujours terminé. –

3

J'enveloppez la plus extérieure fonction dans un try-catch comme ceci:

int main() 
{ 
    try { 
     // start your program/function 
     Program program; program.Run(); 
    } 
    catch (std::exception& ex) { 
     std::cerr << ex.what() << std::endl; 
    } 
    catch (...) { 
     std::cerr << "Caught unknown exception." << std::endl; 
    } 
} 

Cette volonté attrape tout. Une bonne gestion des exceptions en C++ ne consiste pas à écrire un try-catch partout, mais à savoir où vous savez comment le gérer (comme vous semblez vouloir le faire). Dans ce cas, la seule chose à faire est d'écrire le message d'erreur sur stderr afin que l'utilisateur puisse agir dessus.

+0

Daniel, il existe plusieurs types d'exceptions qui ne sont pas interceptées par catch (...) spécialement si vous utilisez VC++ qui différencie la gestion des exceptions structurée et non structurée. – Jaywalker

+0

Mais ce ne sont pas des exceptions C++. (et les erreurs équivalentes dans Linux ne sont pas attrapées par un try/catch non plus) – jalf

+0

Eh bien, l'affiche disait seulement qu'il utilisait C++. Il n'y avait aucune mention de plate-forme spécifique. –