Std::abort et std::exit (et plus: std::_Exit, std::quick_exit) ne sont que des fonctions de niveau inférieur. Vous les utilisez pour indiquer au programme ce que vous voulez précisément qu'il fasse : quels destructeurs (et si) appeler, quelles autres fonctions de nettoyage appeler, quelle valeur retourner, etc.
std::terminate est une abstraction de niveau supérieur : elle est appelée (soit par le runtime, soit par vous) pour indiquer qu'une erreur s'est produite dans le programme et que, pour une raison quelconque, il n'est pas possible de la gérer en lançant une exception. La nécessité de cela se produit généralement lorsque des erreurs surviennent dans le mécanisme d'exception lui-même, mais vous pouvez l'utiliser à tout moment lorsque vous ne voulez pas que votre programme continue au-delà de l'erreur donnée. J'ai compilé la liste complète des situations où std::terminate est appelé dans mon message. Il n'est pas spécifié ce que std::terminate fait, car vous êtes en contrôle. Vous pouvez configurer le comportement en enregistrant n'importe quelles fonctions. Les limitations que vous avez sont que la fonction ne peut pas retourner au site d'erreur et ne peut pas sortir via une exception, mais techniquement vous pouvez même démarrer votre pompe de messages à l'intérieur. Pour la liste des choses utiles que vous pouvez faire à l'intérieur, voir mon autre message.
En particulier, notez que std::terminate est considéré comme un gestionnaire d'exceptions dans les contextes où std::terminate est appelé en raison d'une exception lancée qui n'a pas pu être gérée, et vous pouvez vérifier quelle était l'exception et l'inspecter en utilisant C++11 en utilisant std::rethrow_exception et std::current_exception. Tout est dans mon message.
3 votes
Ce n'est pas un doublon, mais plutôt un sous-ensemble avec quelques bonnes réponses stackoverflow.com/questions/397075/… et il était aussi marqué C++!
0 votes
std::abort
est raisonnable si une exception ne peut pas être résolue dans un destructeur.1 votes
Pour plus d'informations sur
std::terminate
, consultez ces articles du blog C++ excellent d'Andrzej : akrzemi1.wordpress.com/2011/09/28/who-calls-stdterminate , akrzemi1.wordpress.com/2011/10/05/using-stdterminate