2009-03-08 13 views
4

ich dieses Stück Code versucht, zu prüfen, ob die Division durch Null Ausnahme abgefangen wird:Fangen Ausnahme im Code

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

Wenn ich diese mit VC6 nachgekommen wurde die catch-Handler ausgeführt und der Ausgang war " Ausnahme abgefangen ". Als ich das mit VS2008 kompilierte, stürzte das Programm jedoch ab, ohne den catch-Block auszuführen. Was könnte der Grund für den Unterschied sein?

Antwort

5

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

Verwenden Sie einen Versuch außer. Idealerweise liefert ein Filter, der den Ausnahmecode überprüft, dann die konstante Signalisierung zurück, wenn er abfangen möchte. Ich habe das hier ausgelassen, aber ich empfehle Ihnen, für Beispiele des Filters here zu sehen.

+0

'TRUE' ist kein gültiger Wert für den Ausnahmefilter. siehe http://msdn.microsoft.com/en-us/library/s58ftw19(VS.80).aspx – shoosh

+0

Es wird implizit auf die gleiche Konstante für 1 umgewandelt und kompiliert und läuft gut. –

0

In Visual Studio Fall kann es eine Compiler-Optionen sein. Aber standardmäßig wird die Ausnahme nicht ausgelöst.

2

Sie erfassen Ausnahmen, die von der strukturierten SEH-Schicht (Microsoft Exceprary Handling) generiert werden. Dies ist eine für Microsoft spezifische Betriebssystemproblematik. Wie von Mykola vorgeschlagen, müssen Sie möglicherweise an Ihren Compileroptionen herumhantieren, aber beachten Sie, dass dieser Code dann nicht auf andere Betriebssysteme oder sogar auf andere Compiler unter Windows übertragen werden kann.

1

Gehen Sie zu Ihren Projekteigenschaften, Unter C/C++, Code Generation, finden Sie "C++ Ausnahmen aktivieren". Ändern Sie diese Option auf „Ja, mit SEH Ausnahmen“

Wohlgemerkt, dass Sie nur in der Lage, diese Art von Ausnahmen zu fangen entweder von:

  • try {} catch(...) {} (mit der Auslassung)
  • __try {} __except() {} (mit ein geeigneter Filter in den __except)
  • von SetUnhandledExceptionFilter()

für gültige Werte imVerwendungsee here

+0

Ein richtiger Filter ist gut für den tatsächlichen Code, aber ich habe es zum Beispiel in meiner Antwort vereinfacht. –