0Pricing
C++ Academy · Lekcja

try, catch, throw

Obsługuj błędy za pomocą wyjątków

try, catch, throw to bezpłatna lekcja C++ Academy na CoddyKit. To lekcja 1 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.

Sygnalizowanie błędów za pomocą throw

Instrukcja throw zgłasza wyjątek, przerywając bieżącą ścieżkę wykonania i szukając obsługi na stosie wywołań.

#include <iostream>
#include <stdexcept>

int main() {
    try {
        throw std::runtime_error("boom");
    } catch (const std::exception& e) {
        std::cout << e.what() << "\n";
    }
}

try i catch

Kod, który może zgłosić wyjątek, umieszcza się w bloku try; pasujące procedury obsługi następują w blokach catch.

#include <iostream>
#include <stdexcept>

int divide(int a, int b) {
    if (b == 0) throw std::invalid_argument("divide by zero");
    return a / b;
}

int main() {
    try {
        std::cout << divide(10, 0) << "\n";
    } catch (const std::invalid_argument& e) {
        std::cout << "error: " << e.what() << "\n";
    }
}

Przechwytywanie przez referencję const

Wyjątki należy zawsze przechwytywać przez const&. Przechwytywanie przez wartość powoduje obcinanie wyjątków pochodnych i niepotrzebne kopiowanie.

Wiele bloków catch

Procedury obsługi należy wymieniać od najbardziej szczegółowej do najbardziej ogólnej. Wykonywany jest pierwszy pasujący blok.

#include <iostream>
#include <stdexcept>

int main() {
    try {
        throw std::out_of_range("bad index");
    } catch (const std::out_of_range& e) {
        std::cout << "range: " << e.what() << "\n";
    } catch (const std::exception& e) {
        std::cout << "other: " << e.what() << "\n";
    }
}

Rozwijanie stosu

Gdy zostanie zgłoszony wyjątek, stos się rozwija: każdy lokalny obiekt znajdujący się między miejscem zgłoszenia a procedurą obsługi jest niszczony w odwrotnej kolejności.

#include <iostream>
#include <stdexcept>

struct Trace {
    ~Trace() { std::cout << "unwound\n"; }
};

void f() {
    Trace t;
    throw std::runtime_error("x");
}

int main() {
    try { f(); } catch (...) { std::cout << "caught\n"; }
}

Procedura obsługi wszystkich wyjątków

Blok catch (...) przechwytuje wyjątek dowolnego typu. Należy używać go oszczędnie, zwykle do rejestrowania wyjątku i ponownego jego zgłoszenia.

Ponowne zgłaszanie wyjątku

Wewnątrz procedury obsługi samotne throw; ponownie zgłasza bieżący wyjątek, zachowując jego typ, aby mogła się nim zająć zewnętrzna procedura obsługi.

#include <iostream>
#include <stdexcept>

void inner() { throw std::runtime_error("deep"); }

void middle() {
    try { inner(); }
    catch (...) { std::cout << "logged\n"; throw; }   // rethrow
}

int main() {
    try { middle(); } catch (const std::exception& e) { std::cout << e.what() << "\n"; }
}

Standardowa hierarchia wyjątków

Większość standardowych wyjątków dziedziczy po std::exception, który udostępnia funkcję what(). Przechwycenie std::exception obsługuje je wszystkie.

Zgłaszaj przez wartość, przechwytuj przez referencję

Tymczasowe obiekty wyjątków należy zgłaszać przez wartość; środowisko uruchomieniowe kopiuje je w bezpieczne miejsce. Należy przechwytywać je przez referencję, aby uniknąć obcinania.

Wyjątki a kody błędów

Wyjątki oddzielają ścieżkę obsługi błędu od głównej ścieżki wykonania i nie można ich zignorować po cichu — w przeciwieństwie do kodów zwrotnych. Należy rezerwować je dla rzeczywiście wyjątkowych sytuacji.

Nieprzechwycone wyjątki kończą działanie programu

Jeśli żadna procedura obsługi nie pasuje, wywoływana jest funkcja std::terminate i program zostaje przerwany. Należy zawsze obsługiwać oczekiwane wyjątki.

Szybkie sprawdzenie

Proszę sprawdzić swoją znajomość obsługi wyjątków.

Podsumowanie

Poznali Państwo sposób zgłaszania błędów za pomocą throw i obsługiwania ich przez try/catch, a także dowiedzieli się Państwo, jak rozwijanie stosu niszczy napotkane obiekty lokalne. Wyjątki należy przechwytywać przez const&, porządkować procedury obsługi od szczegółowych do ogólnych i ponownie zgłaszać za pomocą samotnego throw;.

Często zadawane pytania

Czy lekcja „try, catch, throw” jest bezpłatna?

Tak — pełny tekst „try, catch, throw” 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 „try, catch, throw”?

Obsługuj błędy za pomocą wyjątków Ć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 1 z 4.

Ile czasu zajmuje lekcja „try, catch, throw”?

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