try, catch, throw
Håndtér fejl med exceptions
try, catch, throw er en gratis C++ Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i C++ Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C++ Academy-kurset indeholder 4 lektioner i alt.
Signalering af fejl med throw
Sætningen throw rejser en undtagelse, afbryder det aktuelle forløb og leder efter en håndtering op gennem kaldestakken.
#include <iostream>
#include <stdexcept>
int main() {
try {
throw std::runtime_error("boom");
} catch (const std::exception& e) {
std::cout << e.what() << "\n";
}
}try og catch
Kode, der kan rejse en undtagelse, placeres i en try-blok; de tilsvarende håndteringer følger i catch-blokke.
#include <iostream>
#include <stdexcept>
int divide(int a, int b) {
if (b == 0) throw std::invalid_argument("divide by zero");
return a / b;
}
int main() {
try {
std::cout << divide(10, 0) << "\n";
} catch (const std::invalid_argument& e) {
std::cout << "error: " << e.what() << "\n";
}
}Fang efter const-reference
Fang altid undtagelser efter const&. Hvis du fanger efter værdi, bliver afledte undtagelser afskåret, og der kopieres unødigt.
Flere catch-blokke
Angiv håndteringerne fra den mest specifikke til den mest generelle. Den første matchende blok udføres.
#include <iostream>
#include <stdexcept>
int main() {
try {
throw std::out_of_range("bad index");
} catch (const std::out_of_range& e) {
std::cout << "range: " << e.what() << "\n";
} catch (const std::exception& e) {
std::cout << "other: " << e.what() << "\n";
}
}Afvikling af stakken
Når der rejses en undtagelse, afvikles stakken: Alle lokale objekter mellem stedet, hvor undtagelsen rejses, og håndteringen destrueres i omvendt rækkefølge.
#include <iostream>
#include <stdexcept>
struct Trace {
~Trace() { std::cout << "unwound\n"; }
};
void f() {
Trace t;
throw std::runtime_error("x");
}
int main() {
try { f(); } catch (...) { std::cout << "caught\n"; }
}Håndtering af alle undtagelser
En catch (...)-blok fanger alle undtagelsestyper. Brug den sparsomt, som regel til at logge og rejse undtagelsen igen.
Genfremsættelse af en undtagelse
Inde i en håndtering rejser en bar throw; den aktuelle undtagelse igen og bevarer dens type, så en ydre håndtering kan tage sig af den.
#include <iostream>
#include <stdexcept>
void inner() { throw std::runtime_error("deep"); }
void middle() {
try { inner(); }
catch (...) { std::cout << "logged\n"; throw; } // rethrow
}
int main() {
try { middle(); } catch (const std::exception& e) { std::cout << e.what() << "\n"; }
}Standardhierarki for undtagelser
De fleste standardundtagelser nedarver fra std::exception, som stiller what() til rådighed. Hvis du fanger std::exception, håndterer du dem alle.
Rejs efter værdi, fang efter reference
Rejs midlertidige undtagelsesobjekter efter værdi; kørselssystemet kopierer dem til et sikkert område. Fang efter reference for at undgå afskæring.
Undtagelser kontra fejlkoder
Undtagelser adskiller fejlforløbet fra normalforløbet og kan ikke ignoreres stiltiende — i modsætning til returkoder. Brug dem kun i situationer, der reelt er ekstraordinære.
Ufangede undtagelser afslutter programmet
Hvis ingen håndtering matcher, kaldes std::terminate, og programmet afbrydes. Håndtér altid de undtagelser, du forventer.
Hurtig test
Test din forståelse af undtagelseshåndtering.
Opsummering
Du har lært at rejse fejl med throw, håndtere dem med try/catch og hvordan stakafvikling destruerer lokale objekter undervejs. Fang efter const&, ordn håndteringer fra specifik til generel, og rejs undtagelsen igen med en bar throw;.
Lær C++ med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 51
- Lektioner
- 203
Ofte stillede spørgsmål
Er lektionen “try, catch, throw” gratis?
Ja — alle 3 lektioner i læringssporet C++ Academy, inklusive “try, catch, throw”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. C++ Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “try, catch, throw”?
Håndtér fejl med exceptions Du øver dig i C++ Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på C++ Academy?
Der kræves ingen tidligere erfaring. C++ Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.
Hvor lang tid tager lektionen “try, catch, throw”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne C++ Academy-lektion?
Ja. Alle C++ Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.