C++ Academy · Oppitunti

Mukautetut poikkeustyypit

Määritä omia poikkeuksia

Oppitunti 4/413 vaihetta

Mukautetut poikkeustyypit on ilmainen C++ Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu C++ Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. C++ Academy-kurssilla on yhteensä 4 oppituntia.

Miksi omia poikkeuksia?

Omien poikkeustyyppien määritteleminen antaa kutsujille mahdollisuuden ottaa omat virheenne vastaan täsmällisesti ja välittää virheen mukana toimialakohtaisia tietoja.

Perikää std::exception-luokasta

Perustakaa poikkeuksenne luokkaan std::exception tai sen aliluokkaan, jotta ne toimivat standardikäsittelijöiden kanssa ja tarjoavat funktion what().

#include <exception>
#include <string>

class ConfigError : public std::exception {
    std::string msg;
public:
    explicit ConfigError(std::string m) : msg(std::move(m)) {}
    const char* what() const noexcept override { return msg.c_str(); }
};

Heittäminen ja vastaanottaminen

Tyyppinne toimii kuten mikä tahansa muu poikkeus: heittäkää se ja ottakaa se vastaan viitteenä.

#include <iostream>
#include <exception>
#include <string>

class ConfigError : public std::exception {
    std::string msg;
public:
    explicit ConfigError(std::string m) : msg(std::move(m)) {}
    const char* what() const noexcept override { return msg.c_str(); }
};

int main() {
    try {
        throw ConfigError("missing key");
    } catch (const ConfigError& e) {
        std::cout << e.what() << "\n";
    }
}

Käyttäkää standardin kantaluokkia uudelleen

Usein voitte periä luokasta std::runtime_error tai std::logic_error, jotka tallentavat viestin valmiiksi — näin tarvitaan vähemmän toistuvaa pohjakoodia.

#include <stdexcept>
#include <string>

class NetworkError : public std::runtime_error {
public:
    explicit NetworkError(const std::string& m) : std::runtime_error(m) {}
};

Lisätietojen välittäminen

Omat poikkeukset voivat sisältää kenttiä, kuten virhekoodin tai virheen aiheuttaneen arvon, jolloin käsittelijät saavat enemmän kontekstia.

#include <stdexcept>
#include <string>

class HttpError : public std::runtime_error {
public:
    int status;
    HttpError(int s, const std::string& m)
        : std::runtime_error(m), status(s) {}
};

Vastaanottaminen kantaluokan avulla

Koska tyyppinne perii luokan std::exception, yleinen käsittelijä voi silti ottaa sen vastaan kantaluokan viitteen kautta.

#include <iostream>
#include <stdexcept>

class HttpError : public std::runtime_error {
public:
    int status;
    HttpError(int s, const std::string& m) : std::runtime_error(m), status(s) {}
};

int main() {
    try {
        throw HttpError(404, "not found");
    } catch (const std::exception& e) {
        std::cout << e.what() << "\n";
    }
}

Rakentakaa poikkeushierarkia

Ryhmitelkää toisiinsa liittyvät virheet yhteisen kantaluokan alle, jotta kutsujat voivat ottaa vastaan kokonaisen virheperheen tai yhden tietyn tyypin.

#include <stdexcept>

struct AppError : std::runtime_error { using std::runtime_error::runtime_error; };
struct DbError  : AppError       { using AppError::AppError; };
struct AuthError: AppError       { using AppError::AppError; };

Pitäkää what() noexcept-määreisenä

Ylikirjoittakaa what() muodossa const noexcept ja palauttakaa vakaa puskuri — funktio ei saa koskaan heittää poikkeusta eikä palauttaa vanhentunutta osoitinta.

Heittäkää arvona

Heittäkää poikkeusobjektit arvona, esimerkiksi throw HttpError(500, "x");. Suoritusympäristö huolehtii niiden tallennuksesta purkamisen aikana.

Dokumentoikaa heitettävät poikkeukset

Tehkää ohjelmointirajapinnan poikkeustyypeistä osa sen sopimusta, jotta kutsujat tietävät, mitä käsittelijöitä kirjoittaa.

Pitäkää se yksinkertaisena

Useimmat projektit tarvitsevat vain pienen joukon poikkeustyyppejä. Periytyminen luokasta std::runtime_error kattaa suurimman osan tapauksista selkeästi.

Pikatarkistus

Testatkaa, miten hyvin ymmärrätte omat poikkeukset.

Kertaus

Opitte määrittelemään omia poikkeustyyppejä periyttämällä ne luokasta std::exception tai std::runtime_error, välittämään lisätietoja, rakentamaan hierarkioita, pitämään funktion what() noexcept-määreisenä ja heittämään poikkeukset arvona. Pitäkää tyyppien joukko pienenä ja dokumentoituna.

Aloita maksutta

Opi C++ tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
51
Oppitunnit
203

Usein kysytyt kysymykset

Onko oppitunti ”Mukautetut poikkeustyypit” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa C++ Academy-oppimispolun 3 oppituntia, myös oppitunnin “Mukautetut poikkeustyypit”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. C++ Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Mukautetut poikkeustyypit”?

Määritä omia poikkeuksia Harjoittelet C++ Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni C++ Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin C++ Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.

Kuinka kauan ”Mukautetut poikkeustyypit”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä C++ Academy-oppitunnilla?

Kyllä. Jokainen C++ Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. try, catch, throw
  2. Poikkeusturvallisuus
  3. noexcept-määrite
  4. Mukautetut poikkeustyypit
← Takaisin: C++ Academy