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.