errdefer do sprzątania po niepowodzeniu
Cofaj wykonane działania tylko wtedy, gdy coś się nie powiedzie.
errdefer do sprzątania po niepowodzeniu to bezpłatna lekcja Zig Academy na CoddyKit. To lekcja 3 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 Zig Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Zig Academy zawiera 4 lekcji w sumie.
Czyszczenie tylko w przypadku niepowodzenia
Czasami po nieudanej operacji trzeba cofnąć wykonane działania, ale zachować je po sukcesie. Właśnie do tego precyzyjnego przypadku służy errdefer.
Poznajemy errdefer
errdefer planuje wykonanie kodu przy opuszczaniu zakresu, ale tylko wtedy, gdy funkcja od tego momentu zwróci błąd.
errdefer allocator.free(buffer);defer zawsze, errdefer w przypadku błędu
defer wykona się niezależnie od sposobu zakończenia zakresu. errdefer wykona się tylko na ścieżce błędu, więc po pomyślnym zakończeniu zostanie całkowicie pominięty.
Zwalnianie częściowo utworzonego wyniku
Najpierw należy zaalokować zasób, a następnie użyć errdefer do jego zwolnienia. Jeśli późniejszy krok się nie powiedzie, bufor zostanie zwolniony; jeśli wszystkie kroki się powiodą, można go zachować i zwrócić.
const buf = try allocator.alloc(u8, n);
errdefer allocator.free(buf);
try fill(buf);Kolejność odzwierciedla alokację
Każdy errdefer należy umieścić bezpośrednio po odpowiadającym mu pozyskaniu zasobu. W przypadku niepowodzenia instrukcje wykonają się w odwrotnej kolejności, bezpiecznie wycofując wykorzystane zasoby.
const a = try open();
errdefer a.close();
const b = try open();
errdefer b.close();Sukces zachowuje wykonaną pracę
Gdy funkcja zwraca wartość zamiast błędu, każdy errdefer zostaje pominięty. Wywołujący otrzymuje w pełni utworzony wynik.
return buf;Moment aktywacji ma znaczenie
errdefer zabezpiecza tylko przed błędami, które wystąpią po jego zarejestrowaniu. Błędy wcześniejsze względem tej linii nie mogą go uruchomić, dlatego należy umieszczać go odpowiednio wcześnie.
Przechwytywanie błędu
Można przechwycić błąd w instrukcji errdefer, aby sprawdzić go podczas czyszczenia, na przykład zapisać w logu, która awaria wywołała wycofanie zmian.
errdefer |e| std.debug.print("failed: {}\n", .{e});Konstruktorzy bez wycieków
Funkcje, które alokują zasoby, a następnie mogą zakończyć się błędem, używają errdefer, aby uniknąć wycieków. Częściowo wykonana praca jest automatycznie wycofywana po każdym błędzie.
Połącz z try
Każde try może zakończyć działanie wcześniej w przypadku błędu. Jeśli zarejestrowano errdefer, takie wcześniejsze wyjście nadal uruchomi czyszczenie przed rozwinięciem stosu.
const x = try step();
errdefer rollback(x);
_ = try next(x);Właściwe narzędzie do wycofywania zmian
Proszę użyć errdefer, gdy czyszczenie powinno nastąpić tylko w razie problemów. Zamienia ono zarządzanie zasobami na ścieżce błędu w jedną, klarowną linię kodu.
Szybkie sprawdzenie
Alokują Państwo bufor, a późniejszy krok może się nie powieść. Bufor ma zostać zwolniony tylko w przypadku niepowodzenia. Czego należy użyć?
Podsumowanie
Użyli Państwo errdefer, aby wycofać częściowo wykonaną pracę na ścieżce błędu, umieścili je bezpośrednio po każdym pozyskaniu zasobu i zachowali wyniki zakończone sukcesem. ✅
Często zadawane pytania
Czy lekcja „errdefer do sprzątania po niepowodzeniu” jest bezpłatna?
Tak — pełny tekst „errdefer do sprzątania po niepowodzeniu” 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 Zig Academy, przejdź na CoddyKit PRO. Kurs Zig Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „errdefer do sprzątania po niepowodzeniu”?
Cofaj wykonane działania tylko wtedy, gdy coś się nie powiedzie. Ćwiczysz Zig 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ąć Zig Academy?
Nie wymagamy żadnego doświadczenia. Zig 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 3 z 4.
Ile czasu zajmuje lekcja „errdefer do sprzątania po niepowodzeniu”?
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 Zig Academy?
Tak. Każda lekcja Zig 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
- Odzyskiwanie za pomocą catch
- Przełączanie na podstawie konkretnych błędów
- errdefer do sprzątania po niepowodzeniu
- Zawijanie i ponowne zgłaszanie błędów