C++ Poikkeuskäsittely: Kokeile, ota kiinni, heitä esimerkki
Mitä poikkeuskäsittely sisältää C++?
Poikkeuskäsittely C++ tarjoaa tavan käsitellä odottamattomia tilanteita, kuten ajonaikaisia virheitä. Joten aina odottamattomien olosuhteiden sattuessa ohjelman ohjaus siirretään erikoistoimintoihin, joita kutsutaan käsittelijöiksi.
Saadaksesi poikkeukset kiinni, asetat jonkin koodin osan poikkeustarkastukseen. Koodiosa sijoitetaan try-catch-lohkoon.
Jos kyseisessä koodin osassa tapahtuu poikkeustilanne, tehdään poikkeus. Seuraavaksi poikkeuskäsittelijä ottaa ohjelman hallinnan.
Jos mitään poikkeuksellisia olosuhteita ei tapahdu, koodi suoritetaan normaalisti. Käsittelijät jätetään huomioimatta.
Tässä C++ opetusohjelmassa opit:
Miksi poikkeuskäsittely?
Tässä ovat syyt poikkeuskäsittelyn käyttämiseen C++:
- Erottelet virheenkäsittelykoodin normaalista koodistasi. Koodi on luettavampi ja helpompi ylläpitää.
- Funktiot voivat käsitellä valitsemiaan poikkeuksia. Vaikka funktio antaisi monia poikkeuksia, se käsittelee vain joitain. Soittaja hoitaa jääneet poikkeukset.
Poikkeuskäsittelyn avainsanat
Poikkeuskäsittely C++ pyörii näiden kolmen avainsanan ympärillä:
- heittää– Kun ohjelma kohtaa ongelman, se tekee poikkeuksen. Heitto-avainsana auttaa ohjelmaa suorittamaan heiton.
- saalis– ohjelma käyttää poikkeuskäsittelijää poikkeuksen saamiseen kiinni. Se lisätään ohjelman osaan, jossa sinun on käsiteltävä ongelma. Se tehdään catch-avainsanalla.
- yrittää– try-lohko tunnistaa koodilohkon, jolle tietyt poikkeukset aktivoidaan. Sen jälkeen pitäisi olla yksi/useampi kiinnityslohko.
Oletetaan, että koodilohko aiheuttaa poikkeuksen. Poikkeuksen saa kiinni menetelmällä, joka käyttää try and catch -avainsanoja. Try/catch-lohkon tulisi ympäröidä koodi, joka voi aiheuttaa poikkeuksen. Tällaista koodia kutsutaan suojatuksi koodiksi.
Syntaksi
Try/catch ottaa tämän syntaksin:
try { // the protected code } catch( Exception_Name exception1 ) { // catch block } catch( Exception_Name exception2 ) { // catch block } catch( Exception_Name exceptionN ) { // catch block }
- Vaikka meillä on yksi kokeilulauseke, meillä voi olla monia kiinnityslauseita.
- Poikkeusnimi on kiinnitettävän poikkeuksen nimi.
- Poikkeus1, poikkeus2 ja poikkeusN ovat määrittämiäsi nimiä, joilla viitataan poikkeuksiin.
Esimerkki 1:
#include<iostream> #include<vector> using namespace std; int main() { vector<int> vec; vec.push_back(0); vec.push_back(1); // access the third element, which doesn't exist try { vec.at(2); } catch (exception& ex) { cout << "Exception occurred!" << endl; } return 0; }
lähtö:
Tässä on kuvakaappaus koodista:
Koodin selitys:
- Sisällytä iostream-otsikkotiedosto ohjelmaan käyttääksesi sitä tehtävät.
- Sisällytä vektoriotsikkotiedosto ohjelmaan käyttääksesi sen toimintoja.
- Sisällytä ohjelman std-nimiavaruus sen luokkiin kutsumatta sitä.
- Kutsu main()-funktiota. Ohjelmalogiikka tulisi lisätä sen runkoon.
- Luo vektori nimeltä vec tallentaaksesi kokonaislukutietoja.
- Lisää elementti 0 vektoriin nimeltä vec.
- Lisää elementti 1 vektoriin nimeltä vec.
- Kommentti. Se ohitetaan C++ kääntäjä.
- Käytä try-lausetta poikkeuksen saamiseen kiinni. { merkitsee try/catch-lauseen rungon alkua. Runkoon lisätystä koodista tulee suojattu koodi.
- Yritä päästä käsiksi vektorin vektorin indeksiin 2 (kolmannen elementin) tallennettuun elementtiin. Tätä elementtiä ei ole olemassa.
- Try/catch-lohkon rungon loppu.
- Ota kiinni poikkeus. Palautettu virhesanoma tallennetaan muuttujaan ex.
- Tulosta jokin viesti konsolista, jos poikkeus havaitaan.
- Lukituslohkon rungon pää.
- Ohjelman pitäisi palauttaa arvo onnistuneen suorituksen jälkeen.
- Main()-funktion rungon loppu.
Esimerkki 2:
#include <iostream> using namespace std; double zeroDivision(int x, int y) { if (y == 0) { throw "Division by Zero!"; } return (x / y); } int main() { int a = 11; int b = 0; double c = 0; try { c = zeroDivision(a, b); cout << c << endl; } catch (const char* message) { cerr << message << endl; } return 0; }
lähtö:
Tässä on kuvakaappaus koodista:
Koodin selitys:
- Sisällytä iostream-otsikkotiedosto ohjelmaan käyttääksesi sen toimintoja.
- Sisällytä ohjelman std-nimiavaruus sen luokkiin kutsumatta sitä.
- Luo funktio nimeltä zeroDivision, joka ottaa kaksi kokonaislukuargumenttia, x ja y. Funktion pitäisi palauttaa kaksinkertainen tulos.
- Käytä if-lausetta tarkistaaksesi, onko muuttujan argumentin y arvo 0. { merkitsee if-kappaleen alkua.
- Palautettava/heitettävä viesti, jos y on 0.
- if-lauseen rungon loppu.
- zeroDivision-funktion pitäisi palauttaa x/y:n arvo.
- NollaDivision-funktion rungon loppu.
- Kutsu main()-metodi. { merkitsee tämän menetelmän alkua.
- Ilmoita kokonaislukumuuttuja ja anna sille arvo 11.
- Ilmoita kokonaislukumuuttuja b ja anna sille arvo 0.
- Ilmoita kaksoismuuttuja c ja anna sille arvo 0.
- Käytä try-lausetta poikkeuksen saamiseen kiinni. { merkitsee try/catch-lauseen rungon alkua. Runkoon lisätystä koodista tulee suojattu koodi.
- Kutsutaan zeroDivision-funktio ja siirrytään argumenteille a ja b eli 11 ja 0. Tämän operaation tulos tallennetaan muuttujaan c.
- Tulosta muuttujan c arvo konsolista.
- Try/catch-lohkon rungon loppu.
- Ota kiinni poikkeus. Palautettu virhesanoma tallennetaan muuttujaviestiin.
- Tulosta palautettu virheilmoitus konsolista.
- Lukituslohkon rungon pää.
- Ohjelman pitäisi palauttaa arvo onnistuneen suorituksen jälkeen.
- Main()-funktion rungon loppu.
C++ Vakiopoikkeukset
C++ mukana tulee luettelo kohdassa määritellyistä vakiopoikkeuksista luokkaa. Nämä on kuvattu alla:
Poikkeus | Tuotetiedot |
---|---|
std::poikkeus | Tämä on poikkeus ja kaikkien standardien yläluokka C++ poikkeuksia. |
std::bad_alloc | Tämä poikkeus johtuu uudesta avainsanasta. |
std::bad_cast | Tämä on dynamic_castin tekemä poikkeus. |
std::bad_exception | Hyödyllinen laite odottamattomien poikkeusten käsittelyyn C++ ohjelmia. |
std::bad_typeid | Typeidin heittämä poikkeus. |
std::logic_error | Tämä poikkeus on teoriassa havaittavissa lukemalla koodia. |
std::domain_error | Tämä on poikkeus, joka syntyy matemaattisesti virheellisen verkkotunnuksen käytön jälkeen. |
std::invalid_argument | Poikkeus virheellisten argumenttien käytöstä. |
std::length_error | Poikkeus suuren std::stringin luomisen jälkeen. |
std::alueen_ulkopuolinen | Metodin mukaan. |
std::runtime_error | Tämä on poikkeus, jota ei voida havaita lukemalla koodia. |
std::overflow_error | Tämä poikkeus heitetään matemaattisen ylivuodon jälkeen. |
std::range_error | Tämä poikkeus heitetään, kun yrität tallentaa alueen ulkopuolella olevan arvon. |
std::underflow_error | Matemaattisen alivuodon jälkeen tehty poikkeus. |
Käyttäjän määrittämät poikkeukset
- C++ std::exception-luokan avulla voimme määritellä objekteja, jotka voidaan heittää poikkeuksiksi. Tämä luokka on määritelty otsikko. Luokka tarjoaa meille virtuaalisen jäsenfunktion nimeltä what.
Tämä funktio palauttaa tyhjäpäätteisen merkkijonon, jonka tyyppi on char *. Voimme kirjoittaa sen päälle johdetuissa luokissa, jotta saadaan poikkeuskuvaus.
Esimerkiksi:
#include <iostream> #include <exception> using namespace std; class newException : public exception { virtual const char* what() const throw() { return "newException occurred"; } } newex; int main() { try { throw newex; } catch (exception& ex) { cout << ex.what() << '\n'; } return 0; }
lähtö:
Tässä on kuvakaappaus koodista:
Koodin selitys:
- Sisällytä iostream-otsikkotiedosto ohjelmaamme. Käytämme sen toimintoja ilman virheitä.
- Sisällytä poikkeusotsikkotiedosto ohjelmaamme. Käytämme sen toimintoja kuten mitä ilman virheitä.
- Sisällytä std-nimiavaruus ohjelmaamme, jotta voit käyttää sen luokkia kutsumatta sitä.
- Luo uusi luokka nimeltä newException. Tämä luokka perii poikkeusluokan C++.
- Luokan rungon alku.
- Korvaa poikkeuksen otsikkotiedostossa määritetty virtuaalinen jäsenfunktio what(). Kuvaamme sitten omaa poikkeustamme, uutta poikkeusta.
- Aloita uuden poikkeuksen määrittely.
- Palautettava viesti, jos uusi poikkeus havaitaan.
- Uuden poikkeuksen määritelmän loppu.
- Luokan rungon loppu uusiPoikkeus. Newex on nimi, jota käytetään kiinnittämään uusi poikkeus, jonka jälkeen kutsutaan newException.
- Kutsu main()-funktiota. Ohjelmalogiikka tulisi lisätä sen runkoon. { merkitsee sen rungon alkua.
- Käytä try-lausetta merkitäksesi koodi, johon meidän on merkittävä poikkeus. { merkitsee try/catch-lauseen rungon alkua. Tämän ympäröimä koodi tulee suojatuksi.
- Heitä newex-poikkeus, jos se jää kiinni.
- Testin rungon loppu.
- Käytä catch-lausetta poikkeuksen havaitsemiseen. Poikkeusvirheviesti tallennetaan muuttujaan ex.
- Tulosta poikkeusvirheilmoitus konsoliin.
- Cat of catch -lausekkeen loppu.
- Ohjelman pitäisi palauttaa arvo, jos se suoritetaan onnistuneesti.
- Main()-funktion rungon loppu.
Yhteenveto
- Käsittelyä lukuun ottamatta C++, voit käsitellä ajonaikaisia virheitä.
- Ajonaikaiset virheet ovat virheitä, jotka tapahtuvat ohjelman suorittamisen aikana.
- Poikkeuskäsittely auttaa sinua käsittelemään kaikki odottamattomat olosuhteet ohjelmassasi.
- Odottamattoman tilanteen sattuessa ohjelman ohjaus siirtyy käsittelijöille.
- Saadaksesi poikkeuksen kiinni, asetat koodiosan try-catch-lohkon alle.
- Heitto-avainsana auttaa ohjelmaa heittämään poikkeuksia, mikä auttaa ohjelmaa käsittelemään ongelmaa.
- Try-avainsana auttaa tunnistamaan koodilohkon, jolle tietyt poikkeukset aktivoidaan.
- Voimme ylikirjoittaa poikkeuksen otsikkotiedoston what()-funktion määrittääksemme poikkeukset.