C++ Academy · Lektion

try, catch, throw

Håndtér fejl med exceptions

Lektion 1 af 413 trin

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;.

Gratis at komme i gang

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.

Alle lektioner i dette kursus

  1. try, catch, throw
  2. Exception-sikkerhed
  3. noexcept-specifikatoren
  4. Brugerdefinerede exception-typer
← Tilbage til C++ Academy