2015-09-30 5 views
11

Visual Studio 2015; C++ Sprache.try catch-Block in der main() -Funktion ohne Klammern

Ich erinnere mich, dass ich irgendwo über den Eintrittspunkt gelesen (das heißt main-Methode), was es möglich ist, dies zu schreiben:

#include <iostream> 
using namespace std; 

int main() 
try{ 
    return 0; // I am here... 
} 
catch (...){ 
    cout << "I am 'catch'..." << endl; // This row wasn't called! 
    return 1; // Oops... But the next `F10` key pressing jumps from the "try" 
    // block into this row! 
} 

D.h. in diesem Fall wird der try\catch Block nicht in den Klammern befindet:

int main() { // start bracket 
    try{ 
    return 0; 
    } 
    catch (...){ 
    return 1; 
    } 
} // end bracket 

Beide Fälle werden kompiliert auch erfolgreich und arbeiten, aber ... In der ersten Variante, wenn ich Schritt für Schritt am Drücken der Taste F10 nach dem try Block bekomme ich auch in den catch Block. Für die zweite Variante des Codes habe ich kein solches Verhalten.

Warum passiert das? Diese

+2

Wenn Sie nach dem Namen suchen, wird es eine Funktion Try Block genannt.Ich sehe dein Verhalten nicht mit [Clang] (http://coliru.stacked-crooked.com/a/89ae1763b006f80b) oder mit demselben Code auf [online MSVC] (http://webcompiler.cloudapp.net/). . – chris

+1

Und was ist der Statuscode (errorlevel), den Sie erhalten, nachdem die Anwendung ausgeführt wurde? – fritzone

+0

Related: http://stackoverflow.com/questions/335839/can-you-really-have-a-function-method-without-a-body-but-just-a-try-catch-block?rq=1 –

Antwort

9

Ihre Konstruktion ist ein Funktion-try-Block und ist in drafs n4296 für C++ 11 Spezifikation bei 8.4 definiert Funktionsdefinitionen [dcl.fct.def.general] mit:

Funktionsdefinitionen haben die Form

  • Funktionsdefinition:
    • Attribut-specifier-Seq opt Decl-specifier-Seq opt declarator virt-Spezifizierer -seq opt Funktionskörper
  • Funktion Körper:
    • Ctor-initializer opt Verbindung-Anweisung
    • Funktion-try-Block
    • = default;
    • = löschen;

und später in 15 Ausnahmebehandlung [außer] mit:

Funktion-try-Block:

  • try Ctor-initializer opt Verbindung-Anweisung handler-seq

Beispiele legen nahe, dass die normale Verwendung für einen funktions Try-Block eine Ctor sein sollte, aber es gilt für eine normale Funktion (und Haupt ist syntaktisch eine bloße Funktion)

Es ist gültig und funktioniert in der Regel, Das bedeutet, dass der catch-Block nur ausgewertet wird, wenn eine Ausnahme in der ctor-Initialisierung opt on in der zusammengesetzten Anweisung auftritt. Sie können dies in Ihrem Code bestätigen, indem Sie in Ihren Blöcken Ausdrucke hinzufügen oder den Rückgabewert testen.

In einem Unix-artigen System

foo 
echo $? 

sollte 0

In einem Windows-System unter einem

Fenster CMD.exe echo
foo.exe 
if errorlevel 1 echo "Catch block" 

sollte nicht ausgegeben Catch block

Wenn Ihr Debugger lässt Sie execute Anweisungen im catch-Block ... es ist nicht C++ 11 konform!

Aber es ist bekannt, dass, wenn ein Block Verlassen MSVC Debugger Cursor auf letzte Zeile des Blocks setzt, gehe ich davon aus, dass ist das, was hier geschieht, weil die letzte Zeile der Funktion-try-Block ist letzte Zeile Fang.

+0

> sollte nicht Catch-Block ausgeben.
Ja, ich sehe nichts ausgeben. –

+0

@AndreyBushman: es bestätigt, dass Ihr Programm korrekt 0 zurückgibt zur Umgebung –

+0

Ich habe mein Codebeispiel für das Zeigen des zusätzlichen interessanten Moments bearbeitet –

-2

Die C++ Spec Zustände:

funktions try-Block assoziierten a handler-seq mit dem Ctor-Initialisierer, falls vorhanden, und die Verbindung-Anweisung. Eine Ausnahme, die während der Ausführung der Compound-Anweisung oder für Konstruktoren und Destruktoren während der Initialisierung oder Zerstörung der Subobjekte der Klasse ausgelöst wird, überträgt Steuerelement an einen Handler in einer Funktion-try-Block in der gleichen Weg wie eine Ausnahme, die während der Ausführung eines try-Blocks ausgelöst wird, übergibt die Kontrolle an andere Handler.

Es gibt keinen speziellen Anwendungsfall für die Verwendung/Verhalten einer Funktion try Block im Konstruktor oder einer anderen Funktion.

+2

Sie konnten es nicht sogar formatieren? :( –

+0

passiert ... mybad..das war nicht beabsichtigt – basav

+4

* hust * Vorschaufenster! –

Verwandte Themen