Question

J'essayais ce code pour vérifier si l'exception concernant la division par zéro était interceptée:

int main(int argc, char* argv[])
{
    try
    {
      //Divide by zero
        int k = 0;
        int j = 8/k;
    }
    catch (...)
    {
        std::cout<<"Caught exception\n";
    }
    return 0;
}

Lorsque je me suis conformé à cela avec VC6, le gestionnaire de capture a été exécuté et la sortie était "Exception capturée". Cependant, lorsque j'ai compilé cela à l'aide de VS2008, le programme s'est bloqué sans exécuter le bloc catch. Quelle pourrait être la raison de la différence?

Était-ce utile?

La solution

Activer la gestion des exceptions structurées dans le projet - > propriétés - > propriétés de configuration - > c / c ++ - > génération de code - > activer les exceptions c ++.

Utilisez un essai sauf. Idéalement, avec un filtre qui vérifie le code d'exception, retourne la constante si celui-ci souhaite intercepter. J'ai omis de le mentionner ici, mais je vous recommande de consulter ici pour des exemples de filtres.

#include <iostream>
#include <windows.h>

int main(int argc, char* argv[])
{
    __try
    {
        //Divide by zero
        int k = 0;
        int j = 8/k;
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
        if(GetExceptionCode()==EXCEPTION_INT_DIVIDE_BY_ZERO)
            std::cout << "Caught int divison exception\n";
        else
            std::cout << "Caught exception\n";

        system("pause");
    }
    return 0;
}

Autres conseils

Vous interceptez les exceptions générées par la couche de gestion des exceptions structurées (SEH) de Microsoft, qui est un élément du système d'exploitation spécifique à Microsoft. Comme Mykola l'a suggéré, vous devrez peut-être modifier vos options de compilateur, mais sachez que ce code ne sera alors plus portable vers d'autres systèmes d'exploitation, ni même vers d'autres compilateurs fonctionnant sous Windows.

Accédez aux propriétés de votre projet. Sous C / C ++, Génération de code, vous trouverez "Activer les exceptions C ++". remplacez cette option par "Oui, avec exceptions SEH".

Notez que vous ne pourrez intercepter ce type d’exceptions qu’en utilisant:

  • essayez {} catch (...) {} (avec les points de suspension)
  • __ try {} __except () {} (avec un filtre approprié dans __ sauf )
  • à l'aide de SetUnhandledExceptionFilter ()

Pour les valeurs valides dans __ sauf voir ici

Dans le cas de Visual Studio, il peut s'agir d'une option du compilateur. Mais en standard, l'exception ne sera pas levée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top