errdefer per la pulizia in caso di errore
Annullare il lavoro solo quando qualcosa fallisce
errdefer per la pulizia in caso di errore è una lezione Zig Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Zig Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Zig Academy include 4 lezioni in totale.
Pulizia solo in caso di errore
A volte deve annullare il lavoro eseguito quando un'operazione fallisce, ma conservarlo se ha successo. È proprio questo il caso d'uso di errdefer.
Scopra errdefer
Un errdefer programma l'esecuzione di codice all'uscita dallo scope, ma solo quando la funzione restituisce un errore a partire da quel punto.
errdefer allocator.free(buffer);defer sempre, errdefer in caso di errore
Un defer viene eseguito indipendentemente dal modo in cui termina lo scope. Un errdefer viene eseguito solo nel percorso di errore, quindi in caso di successo viene completamente saltato.
Liberare un risultato incompleto
Allochi la memoria, poi usi errdefer per liberarla. Se un passaggio successivo fallisce, il buffer viene rilasciato; se tutti i passaggi hanno successo, lo conserva e lo restituisce.
const buf = try allocator.alloc(u8, n);
errdefer allocator.free(buf);
try fill(buf);L'ordine rispecchia l'allocazione
Inserisca ogni errdefer subito dopo l'acquisizione corrispondente. In caso di errore vengono eseguiti in ordine inverso, liberando le risorse in modo sicuro.
const a = try open();
errdefer a.close();
const b = try open();
errdefer b.close();Il successo conserva il lavoro
Quando la funzione restituisce un valore invece di un errore, ogni errdefer viene saltato. Il chiamante riceve il risultato completamente costruito.
return buf;Il punto di attivazione è importante
Un errdefer protegge solo dagli errori che si verificano dopo la sua registrazione. Gli errori precedenti a quella riga non possono attivarlo, quindi lo inserisca presto.
Catturare l'errore
Può catturare l'errore in un errdefer per analizzarlo durante la pulizia, ad esempio per registrare quale fallimento ha attivato il rollback.
errdefer |e| std.debug.print("failed: {}\n", .{e});Costruire costruttori senza perdite
Le funzioni che allocano memoria e possono poi fallire usano errdefer per evitare perdite. Il lavoro parziale viene annullato automaticamente a ogni errore.
Combinare con try
Ogni try può uscire in anticipo in caso di errore. Se è stato registrato un errdefer, questa uscita anticipata attiva comunque la pulizia prima del disaccoppiamento dello scope.
const x = try step();
errdefer rollback(x);
_ = try next(x);Lo strumento giusto per il rollback
Usi errdefer quando la pulizia deve avvenire solo se qualcosa va storto. Trasforma la gestione delle risorse nel percorso di errore in un'unica riga chiara.
Verifica rapida
Allochi un buffer, poi un passaggio successivo potrebbe fallire. Vuole liberarlo solo in caso di errore. Che cosa usa?
Riepilogo
Ha usato errdefer per annullare il lavoro parziale nel percorso di errore, lo ha inserito subito dopo ogni acquisizione e ha mantenuto intatti i risultati ottenuti con successo. ✅
Domande Frequenti
La lezione «errdefer per la pulizia in caso di errore» è gratuita?
Sì — il testo completo di «errdefer per la pulizia in caso di errore» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Zig Academy, passa a CoddyKit PRO. Il corso Zig Academy include 4 lezioni in totale.
Cosa imparerò in «errdefer per la pulizia in caso di errore»?
Annullare il lavoro solo quando qualcosa fallisce Eserciti Zig Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Zig Academy?
Non è richiesta alcuna esperienza precedente. Zig Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.
Quanto tempo richiede la lezione «errdefer per la pulizia in caso di errore»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Zig Academy?
Sì. Ogni lezione Zig Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Recuperare con catch
- Usare switch su errori specifici
- errdefer per la pulizia in caso di errore
- Avvolgere e rilanciare gli errori