try außerhalb von Funktionen

Auch nach 13 Jahren lerne ich was Neues in C++ … oder sollte ich mich schämen, dass ich es noch nicht wusste?

try - catch funktioniert auch außerhalb von Funktionen.

und ganz konkret: Bei Konstruktor-Code kann try-catch die Memberinitialisierung prüfen…


Das kennt vermutlich jeder:

 1#include <iostream>
 2#include <string>
 3
 4void throw_something()
 5{
 6  throw 1;
 7}
 8
 9int foo()
10{
11  try
12  {
13    throw_something();
14    std::cout << "No error - no problem";
15    return 0;
16  }
17  catch(int error_code)
18  {
19    std::cerr << "Exception: " << error_code;
20    return error_code;
21  }
22}
23
24int main()
25{
26  return foo();
27}

Aber, dass try-catch auch außerhalb von Funktionen, bzw. ohne Funktionsklammern funktioniert, ist mir bisher tatsächlich noch nicht untergekommen:

 1int foo()
 2try
 3{
 4  throw_something();
 5  std::cout << "No error - no problem";
 6  return 0;
 7}
 8catch(int error_code)
 9{
10  std::cerr << "Exception!";
11  return error_code;
12}

Na gut, das bringt einem jetzt nicht wirklich was, weil es genau das gleiche macht, wie der erste Code.

Aber … wenn man in einem Konstruktor die Initialisierung einer Membervariable per try-catch behandeln möchte, dann muss try außerhalb des Funktionsrumpfes arbeiten.

Und das sieht dann so aus:

 1struct clazz
 2{
 3  std::string member;
 4
 5  clazz()
 6  try
 7  : member("Hello World")
 8  {
 9    std::cout << "yay, member initialized";
10  }
11  catch(...)
12  {
13    std::cerr << "oh no, member initialization failed";
14  }
15};

Lustig, dass ich das bis heute nie gebraucht hatte und auch nicht wusste. Dafür liebe ich diesen Compiler … er kann mich nach so vielen Jahren immer noch (mit neuem Wissen) überraschen.

Tja, ein Code sagt mehr als tausend Worte, also: End-Of-Blog.


Wenn sich eine triviale Erkenntnis mit Dummheit in der Interpretation paart, dann gibt es in der Regel Kollateralschäden in der Anwendung.
frei zitiert nach A. Van der Bellen
... also dann paaren wir mal eine komplexe Erkenntnis mit Klugheit in der Interpretation!