2

J'utilise VC2010 et j'écris le code suivant pour tester la fonction "set_unexpected"."set_unexpected" ne fonctionne pas dans VC2010?

#include <iostream> 
#include <exception> 

void my_unexpected_handler() 
{ 
    std::cout << "unexpected handler" << std::endl; 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    set_unexpected(my_unexpected_handler); 

    throw 1; 

    return 0; 
} 

Cependant, « my_unexpected_handler » est jamais appelé (la chaîne n'est pas imprimé à la console, j'ai essayé de mettre en my_unexpected_handler point d'arrêt, n'a pas couru dans).

Quel est le problème avec mon code?

Merci


Désolé, j'ai mal compris l'exception inattendue. Cependant, même si je change le code à suivre

#include <iostream> 
#include <exception> 

void my_unexpected_handler() 
{ 
    std::cout << "unexpected handler" << std::endl; 
} 

void func() throw(int) 
{ 
    throw 'h'; 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    std::set_unexpected(my_unexpected_handler); 

    func(); 

    return 0; 
} 

Il ne fonctionne toujours pas? Autrement dit, "my_unexpected_handler" n'est pas appelé.

+0

Ce code ne devrait pas même compiler. Vous devez qualifier 'set_unexpected' avec un' std :: '. Poster le code réel. En outre, vous êtes probablement à la recherche de 'set_terminate' si vous êtes dans' main'. – dirkgently

+1

Faites attention aux avertissements: 'avertissement C4290: spécification d'exception C++ ignorée sauf pour indiquer qu'une fonction n'est pas __declspec (nothrow)' –

Répondre

1

Étant donné que la fonction rejetant l'exception n'a pas de spécification throw, l'exception est attendue. Le gestionnaire d'exceptions inattendu, assez logiquement, gère uniquement unexpected exceptions. Rien ne rend cette exception inattendue.

3

Vous ne faites probablement rien de mal. Vous utilisez Visual Studio 2010 et ce compilateur ne prend pas en charge les spécifications d'exception. Eh bien, il vérifie la syntaxe du code en les utilisant, mais ne vérifie pas le type exceptiontype lors de l'exécution.

voir http://msdn.microsoft.com/en-us/library/wfa0edys(v=vs.100).aspx

On ne considère pas généralement un problème comme des exceptions spécifications sont généralement pas considérés comme utiles, et ont en fait été dépréciée dans C++ puis 11 norme