Wzorce obsługi błędów
Łącz optional i expected
Wzorce obsługi błędów to bezpłatna lekcja C++ Academy na CoddyKit. To lekcja 4 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.
Dwa narzędzia, jeden cel
std::optional i std::expected zastępują podatne na błędy wartości specjalne. W tej lekcji pokazano wzorce ich przejrzystego łączenia i komponowania.
Wczesny zwrot dla pustej wartości
To prosty i czytelny wzorzec: należy sprawdzić optional i natychmiast zakończyć działanie, jeśli jest pusty, a dopiero potem kontynuować.
#include <iostream>
#include <optional>
std::optional<int> parse(bool ok) { return ok ? std::optional<int>(5) : std::nullopt; }
int main() {
auto v = parse(true);
if (!v) { std::cout << "no value\n"; return 0; }
std::cout << *v + 1 << "\n";
}Konwersja optional na expected
Brak wartości w optional można zamienić na opisany błąd, gdy kod wywołujący potrzebuje znać przyczynę.
#include <expected>
#include <optional>
#include <string>
std::expected<int, std::string> require(std::optional<int> o) {
if (o) return *o;
return std::unexpected("value missing");
}
int main() {}Łączenie za pomocą value_or
Gdy wyniki kilku wyszukiwań składają się na jeden rezultat, value_or umożliwia podanie wartości domyślnych bezpośrednio, bez zagnieżdżonych instrukcji if.
#include <iostream>
#include <optional>
int setting(std::optional<int> user, int fallback) {
return user.value_or(fallback);
}
int main() {
std::cout << setting(std::nullopt, 42) << "\n";
}Propagowanie błędów w górę
Za pomocą std::expected funkcja może sprawdzić wynik wywołania podrzędnego i przekazać jego błąd bez zmian, tworząc potok obsługi błędów.
#include <expected>
#include <string>
using R = std::expected<int, std::string>;
R step1(bool ok) { return ok ? R(2) : R(std::unexpected("step1 failed")); }
R run(bool ok) {
auto r = step1(ok);
if (!r) return std::unexpected(r.error());
return *r * 10;
}
int main() {}Monadyczne and_then
W C++23 funkcja and_then łączy operacje, z których każda zwraca optional albo expected. Kończy działanie przy pierwszym niepowodzeniu, bez ręcznie budowanego łańcucha instrukcji if.
transform do mapowania
transform stosuje zwykłą funkcję do wartości oznaczającej sukces, pozostawiając błędy lub pustą wartość bez zmian — mapuje tylko pomyślną ścieżkę.
or_else do obsługi odzyskiwania
or_else uruchamia funkcję awaryjną, która może dostarczyć wartość zastępczą albo alternatywny błąd, gdy pierwotna wartość jest pusta lub operacja się nie powiodła.
Wybór między nimi
Proszę użyć optional, gdy brak wartości nie wymaga wyjaśnienia, na przykład przy braku wyniku w pamięci podręcznej. Proszę użyć expected, gdy kod wywołujący musi rozróżniać przyczyny niepowodzenia, na przykład błędy parsowania i uprawnień.
Unikanie mieszania wartości specjalnych
Nie należy łączyć starych kodów błędów z optional/expected w jednym API. Należy wybrać jedną spójną strategię, aby kod wywołujący obsługiwał niepowodzenia jednolicie.
Zachowywanie typów błędów
Gdy niepowodzenia są sprawdzane programowo, lepiej użyć wyliczenia albo małej struktury jako typu błędu niż zwykłych ciągów znaków. Ciągi znaków najlepiej sprawdzają się w komunikatach dla użytkownika.
Szybkie sprawdzenie
Sprawdź swoją wiedzę na temat wzorców obsługi błędów.
Podsumowanie
Poznałeś(-aś) wzorce obsługi błędów:
- Wczesny zwrot dla pustej wartości lub błędu utrzymuje płaską strukturę kodu.
- Optional należy konwertować na expected, gdy potrzebna jest przyczyna.
- Komponowanie umożliwiają
and_then,transformior_else(C++23). - Należy zachować spójność i unikać mieszania wartości specjalnych z optional/expected.
Ucz się C++ dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 51
- Lekcje
- 203
Często zadawane pytania
Czy lekcja „Wzorce obsługi błędów” jest bezpłatna?
Tak — pełny tekst „Wzorce obsługi błędó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 „Wzorce obsługi błędów”?
Łącz optional i expected Ć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 4 z 4.
Ile czasu zajmuje lekcja „Wzorce obsługi błędó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
- Reprezentowanie braku wartości za pomocą optional
- Dostęp do wartości optional
- Podstawy std::expected
- Wzorce obsługi błędów