1

Quel est le comportement standard dans les cas où la fonction renvoie une exception et non une liste d'exceptions valide? Par exemple, quand je lance ce code:Spécification d'exception C++ - gestion des exceptions non valides

#include <iostream> 
#include <cstdlib> 

using namespace std; 

void NotLegal() throw(char) { 
    throw 42; 
} 

void myunexpected() { 
    cout << "exception not in list\n"; 
    cin.get(); 
    exit(0); 
} 

int main() 
{ 
    set_unexpected(myunexpected); 

    try { 
     NotLegal(); 
    } 
    catch(...) { 
     cout << "exception catched"; 
     cin.get(); 
    } 

    return 0; 
} 

Il se comporte différemment sur GCC et Visual Studio C++ compilateurs:

  • Le VS 2010 ne exception attendue est attrapée en général gestionnaire d'exceptions.
  • Sur GCC unexpected(), la fonction de gestionnaire est appelée à la place de l'exception d'interception.

Pourquoi cette différence? Pourquoi compilateur MS C++ n'appelle pas unexpected() rappel?

+1

avez-vous essayé de changer votre exemple? Juste pour être sûr que vous n'obtiendrez pas une conversion automatique entre 42 et un caractère. Essayez simplement throw() au lieu de throw (char). –

+0

c'est la même chose avec une liste d'exceptions vide. –

Répondre

3

The documentation pour set_unexpected appelle ce comportement:

Remarques

...

La norme C++ exige que unexpected est appelée lorsqu'une fonction renvoie une exception qui n'est pas sur sa liste de lancement. La mise en œuvre actuelle ne supporte pas cela.

1

Avez-vous compilé avec les bons drapeaux? Visual Studio a par défaut de ne pas activer la gestion des exceptions pour certaines générations de versions optimisées.

Vous voulez /c and /EHsc

+3

La documentation que vous avez liée à dit * La norme C++ exige que l'inattendu soit appelé lorsqu'une fonction renvoie une exception qui n'est pas dans sa liste de lancement. ** L'implémentation actuelle ne supporte pas cela **. * –

+0

Je soupçonne aussi que VS C++ ne l'a pas implémenté. Pourriez-vous écrire ceci comme réponse séparée? –