Domanda

Stavo provando questo pezzo di codice per verificare se la differenza per zero è stata colta:

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;
}

Quando l'ho rispettato usando VC6, il gestore catch è stato eseguito e l'output era "Eccezione rilevata". Tuttavia, quando l'ho compilato usando VS2008, il programma si è bloccato senza eseguire il blocco catch. Quale potrebbe essere la ragione della differenza?

È stato utile?

Soluzione

Abilita la gestione strutturata delle eccezioni nel progetto - > proprietà - > proprietà di configurazione - > c / c ++ - > generazione del codice - > abilitare le eccezioni c ++.

Usa una prova tranne. Idealmente con un filtro che controlla il codice di eccezione restituisce quindi la segnalazione costante se si desidera catturare. L'ho saltato qui ma ti consiglio di vedere qui per esempi del filtro.

#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;
}

Altri suggerimenti

Stai rilevando eccezioni generate dal livello di gestione delle eccezioni strutturato (SEH) di Microsoft, che è una cosa del sistema operativo specifica di Microsoft. Come suggerito da Mykola, potresti dover giocherellare con le opzioni del tuo compilatore, ma tieni presente che questo codice non sarà quindi portatile con altri sistemi operativi o anche con altri compilatori in esecuzione su Windows.

Vai alle proprietà del tuo progetto, in C / C ++, Generazione di codice, troverai "Abilita eccezioni C ++". modifica questa opzione su " Sì, con eccezioni SEH "

Ricorda che sarai in grado di catturare questo tipo di eccezioni solo usando:

  • prova {} catch (...) {} (con i puntini di sospensione)
  • __try {} __except () {} (con un filtro appropriato in __except )
  • utilizzando SetUnhandledExceptionFilter()

Per valori validi nel __except vedi qui

Nel caso di Visual Studio, possono essere opzioni del compilatore. Ma di norma l'eccezione non verrà generata.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top