Frage

Ich habe diesen Code ausprobiert, um zu überprüfen, ob die Kluft durch keine Ausnahme erwischt wird:

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

Als ich dies mit VC6 einhielt, wurde der Fangbehandler ausgeführt und die Ausgabe "Ausnahme". Als ich dies jedoch mit VS2008 zusammengestellt habe, stürzte das Programm ohne Ausführung des Fangblocks ab. Was könnte der Grund für den Unterschied sein?

War es hilfreich?

Lösung

Aktivieren Sie die strukturierte Ausnahmebehandlung unter Projekt -> Eigenschaften -> Konfigurationseigenschaften -> C/C ++ -> Codegenerierung -> Aktivieren Sie C ++ -Annahmen.

Verwenden Sie einen Versuch außer. Idealerweise mit einem Filter, der den Ausnahmecode überprüft und dann die konstante Signalisierung zurückgibt, wenn er fangen möchte. Ich habe das hier rausgesprungen, aber ich empfehle, dass Sie sehen hier Beispiele für den Filter.

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

Andere Tipps

Sie fangen Ausnahmen auf, die durch die SEH -Ebene (Structured Exception Handling) von Microsoft generiert werden, die für Microsoft spezifisch ist. Wie Mykola vorgeschlagen hat, müssen Sie möglicherweise mit Ihren Compiler -Optionen herumspielen. Beachten Sie jedoch, dass dieser Code dann nicht für andere Betriebssysteme oder sogar für andere unter Windows ausgeführte Compiler tragbar ist.

Gehen Sie zu Ihren Projekteigenschaften unter C/C ++, Codegenerierung, und finden Sie "C ++ -Annahmen aktivieren". Ändern Sie diese Option in "Ja, mit SEH -Ausnahmen"

Wohlgemerkt, dass Sie diese Art von Ausnahmen nur mit beiden Ausnahmen fangen können:

  • try {} catch(...) {} (mit der Ellipsis)
  • __try {} __except() {} (mit einem ordnungsgemäßen Filter in der __except)
  • durch die Nutzung SetUnhandledExceptionFilter()

Für gültige Werte in der __except siehe hier

Im Fall Visual Studio kann es sich um Compiler -Optionen handeln. Aber im Standard wird die Ausnahme nicht ausgelöst.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top