Sicurezza rispetto alle eccezioni
Scrivere codice sicuro rispetto alle eccezioni
Sicurezza rispetto alle eccezioni è una lezione C++ Academy gratuita su CoddyKit. Questa è la lezione 2 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 C++ Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C++ Academy include 4 lezioni in totale.
Che cosa significa la sicurezza delle eccezioni
La sicurezza delle eccezioni descrive quali garanzie il codice mantiene quando un'eccezione viene sollevata nel corso di un'operazione.
La garanzia no-throw
Il livello più forte: l'operazione non solleva mai eccezioni. I distruttori, le operazioni di scambio e quelle di spostamento dovrebbero puntare a questo livello ed essere contrassegnati come noexcept.
La garanzia forte
Se l'operazione solleva un'eccezione, lo stato del programma viene ripristinato come se non fosse mai iniziata: una semantica di commit o rollback.
La garanzia di base
Se l'operazione solleva un'eccezione, non si verificano perdite di risorse e tutte le invarianti restano valide, anche se lo stato esatto potrebbe essere cambiato.
Nessuna garanzia
Il livello più debole: un'eccezione può lasciare il programma in uno stato danneggiato o con perdite di risorse. Eviti di scrivere codice di questo tipo.
RAII fornisce la garanzia di base
Avvolgendo le risorse in oggetti RAII, lo svolgimento dello stack le libera automaticamente, fornendo quasi gratuitamente la garanzia di base.
#include <memory>
#include <stdexcept>
void process() {
auto buf = std::make_unique<int[]>(100); // freed even if throw
throw std::runtime_error("oops"); // no leak
}Copy-and-swap per una forte sicurezza
Una tecnica comune consiste nell'eseguire tutte le operazioni rischiose su una copia e poi inserirla con swap. Lo scambio non solleva eccezioni, quindi la modifica è eseguita interamente oppure non viene eseguita.
void assign(Widget& target, const Widget& src) {
Widget tmp = src; // may throw, target untouched
using std::swap;
swap(target, tmp); // no-throw commit
}Eseguire il commit per ultimo
Esegua ogni operazione che può sollevare un'eccezione prima di qualsiasi modifica irreversibile. Una volta iniziata la mutazione dello stato condiviso, non dovrebbe più essere possibile fallire.
Attenzione agli aggiornamenti parziali
L'aggiornamento di due membri, quando il secondo può sollevare un'eccezione, lascia l'oggetto in uno stato incoerente. Prepari entrambi, quindi esegua il commit di entrambi con passaggi che non sollevano eccezioni.
I distruttori non devono sollevare eccezioni
Un distruttore che solleva un'eccezione durante lo svolgimento dello stack chiama std::terminate. Mantenga i distruttori privi di eccezioni per preservare le garanzie di sicurezza.
Scegliere una garanzia
Punti alla garanzia forte quando è possibile, fornisca sempre almeno quella di base e contrassegni come noexcept le operazioni realmente prive di eccezioni.
Verifica rapida
Verifichi la comprensione della sicurezza delle eccezioni.
Riepilogo
Ha imparato i quattro livelli della sicurezza delle eccezioni: no-throw, forte, di base e nessuna. RAII fornisce automaticamente la garanzia di base; copy-and-swap e il commit finale forniscono la garanzia forte. Mantenga distruttori e operazioni di scambio privi di eccezioni.
Domande Frequenti
La lezione «Sicurezza rispetto alle eccezioni» è gratuita?
Sì — il testo completo di «Sicurezza rispetto alle eccezioni» è 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 C++ Academy, passa a CoddyKit PRO. Il corso C++ Academy include 4 lezioni in totale.
Cosa imparerò in «Sicurezza rispetto alle eccezioni»?
Scrivere codice sicuro rispetto alle eccezioni Eserciti C++ 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 C++ Academy?
Non è richiesta alcuna esperienza precedente. C++ 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 2 di 4.
Quanto tempo richiede la lezione «Sicurezza rispetto alle eccezioni»?
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 C++ Academy?
Sì. Ogni lezione C++ 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
- try, catch, throw
- Sicurezza rispetto alle eccezioni
- Specificatore noexcept
- Tipi di eccezione personalizzati