C++ Academy · leksjon

try, catch, throw

Håndter feil med unntak

Leksjon 1 av 413 trinn

try, catch, throw er en gratis leksjon i C++ Academy på CoddyKit. Dette er leksjon 1 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i C++ Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i C++ Academy inneholder totalt 4 leksjoner.

Signalisere feil med throw

Utsagnet throw utløser et unntak, forlater den nåværende kjøringsbanen og leter etter en behandler oppover i kallstakken.

#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 som kan utløse et unntak, plasseres i en try-blokk. Samsvarende behandlere følger i catch-blokker.

#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 med const-referanse

Fang alltid unntak med const&. Hvis du fanger med verdi, blir avledede unntak avkuttet, og det utføres unødvendige kopieringer.

Flere catch-blokker

List opp behandlerne fra mest spesifikk til mest generell. Den første blokken som samsvarer, kjø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";
    }
}

Stakkavvikling

Når et unntak utløses, blir stakken avviklet: Alle lokale objekter mellom stedet der unntaket utløses og behandleren, destrueres i motsatt rekkefø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"; }
}

Behandler for alle unntak

En catch (...)-blokk fanger alle unntakstyper. Bruk den med måte, vanligvis for å logge og utløse unntaket på nytt.

Utløse unntaket på nytt

Inne i en behandler utløser en naken throw; det gjeldende unntaket på nytt og bevarer typen, slik at en ytre behandler kan håndtere det.

#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"; }
}

Standardunntakshierarkiet

De fleste standardunntak arver fra std::exception, som tilbyr what(). Hvis du fanger std::exception, håndterer du dem alle.

Utløs med verdi, fang med referanse

Utløs midlertidige unntaksobjekter med verdi. Kjøremiljøet kopierer dem til et trygt minneområde. Fang med referanse for å unngå avkutting.

Unntak kontra feilkoder

Unntak skiller feilbanen fra den normale kjøringsbanen og kan ikke ignoreres i stillhet — i motsetning til returkoder. Reserver dem for situasjoner som faktisk er eksepsjonelle.

Ufangede unntak avslutter programmet

Hvis ingen behandler samsvarer, kalles std::terminate, og programmet avbrytes. Håndter alltid unntak du forventer.

Hurtigsjekk

Test forståelsen din av unntakshåndtering.

Oppsummering

Du har lært å utløse feil med throw, håndtere dem med try/catch og hvordan stakkavvikling destruerer lokale objekter underveis. Fang med const&, ordne behandlerne fra spesifikk til generell, og utløs unntaket på nytt med en naken throw;.

Gratis å komme i gang

Lær deg C++ med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
51
Leksjoner
203

Ofte stilte spørsmål

Er leksjonen «try, catch, throw» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien C++ Academy, inkludert «try, catch, throw», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i C++ Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «try, catch, throw»?

Håndter feil med unntak Du øver på C++ Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med C++ Academy?

Ingen tidligere erfaring er nødvendig. C++ Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.

Hvor lang tid tar leksjonen «try, catch, throw»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne C++ Academy-leksjonen?

Ja. Alle C++ Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. try, catch, throw
  2. Unntakssikkerhet
  3. noexcept-spesifikatoren
  4. Egendefinerte unntakstyper
← Tilbake til C++ Academy