Le programme exécuté sur Cygwin ne signale pas une exception renvoyée

Lorsque je lance un programme simple présenté ci-dessous, j’obtiens une sortie de terminal différente sur Cygwin et Ubuntu OS.

#include  #include  #include  using namespace std; double square_root(double x) { if (x < 0) throw out_of_range("x<0"); return sqrt(x); } int main() { const double input = -1; double result = square_root(input); printf("Square root of %f is %f\n", input, result); return 0; } 

Sur Cygwin, contrairement à Ubuntu, je ne reçois aucun message indiquant qu’une exception a été lancée. Quelle peut être la raison de cela? Y a-t-il quelque chose que je dois télécharger pour Cygwin afin qu’il traite les exceptions comme il se doit?

J’utilise la version 1.7.30 de Cygwin avec GCC 4.9.0. Sur Ubuntu, j’ai la version 13.10 avec GCC 4.8.1. Je doute que la différence dans les compilateurs soit importante dans ce cas.

Comme vous n’attrapez pas l’exception, le comportement dépend de l’implémentation / de l’exécution. Cela semble être implémenté différemment pour Linux et cygwin.

Vous devez attraper l’exception vous-même ou utiliser quelque chose comme expliqué dans les réponses à cette question.

Le comportement n’est pas défini dans ce cas – vous vous fiez à la “gentillesse” de l’environnement d’exécution C ++ pour émettre du texte pour “vous n’avez pas rencontré l’exception”, ce que fait effectivement la glibc de Linux. ne pas.

Au lieu de cela, enveloppez votre code principal dans un try/catch pour gérer le throw .

 int main() { try { const double input = -1; double result = square_root(input); printf("Square root of %f is %f\n", input, result); return 0; } catch(...) { printf("Caught exception in main that wasn't handled..."); return 10; } } 

Une solution intéressante, comme l’a suggéré Matt McNabb, est de «renommer le fichier principal» et de faire quelque chose comme ceci:

 int actual_main() { const double input = -1; double result = square_root(input); printf("Square root of %f is %f\n", input, result); return 0; } int main() { try { return actual_main(); } catch(std::exception e) { printf("Caught unhandled std:exception in main: %s\n", e.what().c_str()); } catch(...) { printf("Caught unhandled and unknown exception in main...\n"); } return 10; } 

Notez que nous renvoyons une valeur différente de zéro pour indiquer “Échec” – Je pense qu’au moins Cygwin le fait déjà.