2010-12-14 23 views
1

J'ai une exception levée à partir du code natif dans Visual Studio 10. J'ai activé le lancement sur coup pour toutes les exceptions dans le menu debug-> exceptions. C'est un C++ standard std :: runtime_error, pas de SEH ou d'exceptions gérées impliquées ici. Mais l'exécution ne sera pas interrompue. Il ne les attrapera pas non plus - même si j'ai explicitement attrapé runtime_errors, puisque j'en jette quelques unes. Ils sont finalement attrapés par le code d'appel géré. J'ai mis un point d'arrêt avant la déclaration de lancer et je sais lequel est en train de lancer et pourquoi - mais toujours mystifié quant à pourquoi je ne peux pas le casser ou l'attraper.Impossible de rompre les exceptions dans MSVC

try { 
     //... 
     std::for_each(...) { 
      if (condition) { 
       std::stringstream str; 
       str << "Error: Unexpected end of file in file " << arg.first << "\n"; 
       str << "Unused tokens: \n"; 
       for(int i = 0; i < token_stack.size(); i++) { 
        auto ref = token_stack.top(); 
        str << " " << ref->contents << " at line " << ref->line << "\n"; 
        token_stack.pop(); 
       } 
       throw std::runtime_error(str.str()); 
      } 
     }); 
     //... 
    } 
    catch(const std::runtime_error& exception) { 
     std::cout << exception.what() << std::endl; 
     return; 
    } 

La fonction est éventuellement appelée à partir du code managé. Je sais que cette déclaration de lancer est celle qui lance.

+0

Mauvaises étiquettes? Devrait-il avoir C++ & .NET au lieu de C++ 0x ?? –

+0

@Martin: Non, puisque tout le problème se produit dans le code natif. – Puppy

+0

@DeadMG - ouais mais c'est toujours dans le contexte d'une application gérée et cela n'a rien à voir avec C++ ** 0x ** que ce soit. –

Répondre

0

S'il s'agit d'une application gérée comme vous semblez l'indiquer, alors je pense que vous devez activer le "débogage en mode mixte". Avez-vous vérifié si vous pouvez définir un point d'arrêt dans cette fonction?

+0

Désolé, il était implicite que je mets un point d'arrêt avant l'appel de lancer, et je sais lequel lance parce qu'il s'est cassé. Les points d'arrêt réguliers fonctionnent bien et j'ai le débogage en mode mixte. – Puppy