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.