22.5 Specyfikacje wyjątków

Definiując funkcję można jawnie wyspecyfikować, czy w ogóle i jakiego typu wyjątki mogą zostać zgłoszone, a nieobsłużone podczas jej wykonywania.

Obecnie zaleca się stosowanie tylko dwóch form takich specyfikacji, jak pokazano poniżej:

       int f(int i) noexcept;
       int g(int i);
Deklarujemy tu, że funkcja f nie zgłasza wyjątku; jeśli się mimo to zdarzy, program natychmiast się zakończy przez wywołanie terminate. Funkcja g natomiast może zgłaszać dowolny wyjątek. Specyfikacja wyjątków należy do sygnatury funkcji i musi być powtórzona przy każdej deklaracji i (jednej) definicji.

Specyfikator noexcept może pobierać argument typu (konwertowalnego do) bool; dwie powyższe deklaracje są równoważne

       int f(int i) noexcept(true);
       int g(int i) noexcept(false);
noexcept może być też użyty jako operator; na przykład For example
       void m(int) noexcept(noexcept(f(i)));
       void n(int) noexcept(noexcept(g(i)));
znaczy, że funkcja m ma taką samą specyfikację jak f natomiast n taką samą jak g (oczywiście, f(i)g(i) nie oznaczają tu rzeczywistego wywołania funkcji).


Jeśli taka fraza została podana dla metody wirtualnej, to wszystkie wersje przesłaniające tę metodę w klasach pochodnych mogą być mniej restrykcyjne, ale nigdy bardziej.

T.R. Werner, 23 lutego 2022; 19:40