22.6 Ponawianie wyjątku

Często zdarza się, że przechwytując wyjątek chcemy wykonać pewne czynności (na przykład zwolnić zasoby), ale dalej nie wiemy, czy i jak kontynuować program. Przekazujemy wtedy ten sam wyjątek dalej, po częściowym obsłużeniu, tak aby mógł zostać obsłużony do końca na przykład w funkcji wywołującej. Oczywiście, jak mówiliśmy, nie może być sytuacji takiej, aby jednocześnie były obsługiwane dwa wyjątki. Ale wyjątek uważa się za już obsłużony, jeśli sterowanie weszło do frazy catch. Wewnątrz tego bloku można zatem zgłosić następny wyjątek, w szczególności powtórzyć zgłoszenie tego samego wyjątku który spowodował wejście do tego bloku catch. Wystarczy w tym celu, wewnątrz bloku, użyć instrukcji throw bez żadnego argumentu. Na przykład rozważmy taki schemat:

       void fun() {
           // otwieramy gniazda
           try {
               // korzystamy z gniazd
           }
           catch(...)  // przechwytujemy wszystkie wyjatki
           {
               // zamykamy gniazda
               throw; // ponawiamy ten sam wyjatek
           }
           // zamykamy gniazda
       }
Wewnątrz funkcji otwieramy połączenia internetowe. Korzystamy z nich, ale przewidujemy, że może być zgłoszony wyjątek. Zatem wyłapujemy go, zamykamy połączenia i wznawiamy ten sam wyjątek, aby funkcja wywołująca mogła go przechwycić i zdecydować, co robić dalej. Zauważmy, że funkcja wywołująca nie miałaby możliwości prawidłowego zamknięcia połączeń, jeśli zostały one ustanowione lokalnie w funkcji fun.

T.R. Werner, 23 lutego 2019; 23:59