0Pricing
C++ Academy · Lekcja

Bezpieczeństwo wyjątków

Pisz kod bezpieczny wyjątkowo

Bezpieczeństwo wyjątków to bezpłatna lekcja C++ Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C++ Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C++ Academy zawiera 4 lekcji w sumie.

Znaczenie bezpieczeństwa wyjątków

Bezpieczeństwo wyjątków opisuje gwarancje zachowywane przez kod, gdy wyjątek zostanie zgłoszony w trakcie wykonywania operacji.

Gwarancja niewyrzucania wyjątków

Najsilniejszy poziom: operacja nigdy nie zgłasza wyjątku. Destruktory, funkcje zamiany i operacje przenoszenia powinny do niego dążyć i być oznaczone jako noexcept.

Silna gwarancja

Jeśli operacja zgłosi wyjątek, stan programu zostaje przywrócony do stanu sprzed jej rozpoczęcia — jest to semantyka zatwierdzenia albo wycofania zmian.

Podstawowa gwarancja

Jeśli operacja zgłosi wyjątek, żadne zasoby nie wyciekają, a wszystkie niezmienniki pozostają spełnione, choć dokładny stan może ulec zmianie.

Brak gwarancji

Najsłabszy poziom: wyjątek może pozostawić program w uszkodzonym stanie lub spowodować wyciek zasobów. Należy unikać pisania takiego kodu.

RAII zapewnia podstawową gwarancję

Opakowanie zasobów w obiekty RAII sprawia, że rozwijanie stosu automatycznie je zwalnia — podstawowa gwarancja jest dzięki temu dostępna niemal bez dodatkowego wysiłku.

#include <memory>
#include <stdexcept>

void process() {
    auto buf = std::make_unique<int[]>(100);  // freed even if throw
    throw std::runtime_error("oops");          // no leak
}

Copy-and-swap dla silnej gwarancji

Popularna technika polega na wykonaniu wszystkich ryzykownych operacji na kopii, a następnie zamianie jej za pomocą swap. Zamiana nie zgłasza wyjątków, więc zmiana przebiega całkowicie albo nie zachodzi wcale.

void assign(Widget& target, const Widget& src) {
    Widget tmp = src;          // may throw, target untouched
    using std::swap;
    swap(target, tmp);         // no-throw commit
}

Wykonuj operacje tak, aby zatwierdzać na końcu

Każdą operację, która może zgłosić wyjątek, należy wykonać przed jakąkolwiek nieodwracalną zmianą. Po rozpoczęciu modyfikowania współdzielonego stanu nie powinno już być możliwości niepowodzenia.

Uważaj na częściowe aktualizacje

Aktualizacja dwóch składowych, podczas której druga może zgłosić wyjątek, pozostawia obiekt w niespójnym stanie. Należy przygotować obie zmiany, a następnie zatwierdzić je za pomocą operacji, które nie zgłaszają wyjątków.

Destruktory nie mogą zgłaszać wyjątków

Destruktor zgłaszający wyjątek podczas rozwijania stosu wywołuje std::terminate. Destruktory powinny nie zgłaszać wyjątków, aby zachować gwarancje bezpieczeństwa.

Wybór gwarancji

Należy dążyć do uzyskania silnej gwarancji, gdy jest to wykonalne, zawsze zapewniać co najmniej podstawową gwarancję, a operacje, które rzeczywiście nie zgłaszają wyjątków, oznaczać jako noexcept.

Szybkie sprawdzenie

Proszę sprawdzić swoją znajomość bezpieczeństwa wyjątków.

Podsumowanie

Poznali Państwo cztery poziomy bezpieczeństwa wyjątków: brak wyjątków, gwarancję silną, podstawową i brak gwarancji. RAII automatycznie zapewnia podstawową gwarancję; technika copy-and-swap i zatwierdzanie na końcu zapewniają silną gwarancję. Destruktory i funkcje zamiany nie powinny zgłaszać wyjątków.

Często zadawane pytania

Czy lekcja „Bezpieczeństwo wyjątków” jest bezpłatna?

Tak — pełny tekst „Bezpieczeństwo wyjątków” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C++ Academy, przejdź na CoddyKit PRO. Kurs C++ Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Bezpieczeństwo wyjątków”?

Pisz kod bezpieczny wyjątkowo Ćwiczysz C++ Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C++ Academy?

Nie wymagamy żadnego doświadczenia. C++ Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Bezpieczeństwo wyjątków”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C++ Academy?

Tak. Każda lekcja C++ Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. try, catch, throw
  2. Bezpieczeństwo wyjątków
  3. Specyfikator noexcept
  4. Niestandardowe typy wyjątków
← Powrót do C++ Academy