Kann man wirklich eine Funktion/Methode ohne Körper, sondern nur mit einem Try/Catch-Block haben?

StackOverflow https://stackoverflow.com/questions/335839

  •  22-07-2019
  •  | 
  •  

Frage

Beachten Sie, dass diese Funktion keinen „{“- und „}“-Körper hat.Nur ein Try/Catch-Block:

void func( void )
try
{
    ...
}
catch(...)
{
    ...
}

Ist dies absichtlich Teil von C++ oder handelt es sich um eine G++-Erweiterung?

Gibt es einen anderen Zweck als die Umgehung einer Ebene von {}?

Davon hatte ich noch nie gehört, bis ich zufällig darauf stieß http://stupefydeveloper.blogspot.com/2008/10/c-function-try-catch-block.html

War es hilfreich?

Lösung

Ja, es ist Standard.Funktions-Try-Blöcke, wie sie genannt werden, sind für reguläre Funktionen nicht besonders nützlich, aber für Konstruktoren ermöglichen sie das Abfangen von Ausnahmen, die in der Initialisierungsliste ausgelöst werden.

Beachten Sie, dass im Konstruktorfall die Ausnahme immer am Ende aller Catch-Blöcke erneut ausgelöst wird.

Andere Tipps

Ja, das ist gültig C ++. Ein Zweck ich für sie gefunden habe, ist Ausnahmen in Rückgabewerte zu übersetzen, und hat den Code zu übersetzen die Ausnahmen in Rückgabewerten getrennt von dem anderen Code in der Funktion. Ja, können Sie aus einem catch-Block wie die return x; Sie zeigte (i erst entdeckt habe vor kurzem, dass, tatsächlich). Aber ich würde wahrscheinlich nur eine weitere Ebene der Klammern verwenden und die try / catch innerhalb der Funktion in diesem Fall setzen. Es wird mehr vertraut die meisten C ++ Programmierer.

Ein weiterer Zweck ist Ausnahme von einem Konstruktor Initialisiererliste geworfen zu fangen, die eine ähnliche Syntax verwendet:

struct f {
    g member;
    f() try { 
        // empty
    } catch(...) { 
        std::cerr << "thrown from constructor of g"; 
    }
};

Herb Sutter hat einen guten Artikel zu diesem Thema: http://www.gotw.ca/gotw /066.htm .

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