0Pricing
Zig Academy · Lekcja

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

  1. Odzyskiwanie za pomocą catch
  2. Przełączanie na podstawie konkretnych błędów
  3. errdefer do sprzątania po niepowodzeniu
  4. Zawijanie i ponowne zgłaszanie błędów
← Powrót do Zig Academy