C ++ Poikkeusten käsittely: Kokeile, kiinni, heitä esimerkki

Sisällysluettelo:

Anonim

Mitä poikkeusten käsittely C ++: ssa on?

Poikkeusten käsittely C ++: ssa antaa sinulle mahdollisuuden käsitellä odottamattomia olosuhteita, kuten ajonaikaisia ​​virheitä. Joten aina kun tapahtuu odottamaton olosuhde, ohjelman hallinta siirretään erityistoimintoihin, jotka tunnetaan käsittelijöinä.

Poikkeusten saamiseksi asetat jonkin koodin osan poikkeustarkastukseen. Koodiosa sijoitetaan try-catch-lohkoon.

Jos koodin kyseisessä osassa tapahtuu poikkeustilanne, heitetään poikkeus. Seuraavaksi poikkeuskäsittelijä ottaa ohjelman hallinnan.

Jos poikkeuksellisia olosuhteita ei tapahdu, koodi suoritetaan normaalisti. Käsittelijät jätetään huomiotta.

Tässä C ++ -opetusohjelmassa opit:

  • Mitä poikkeusten käsittely C ++: ssa on?
  • Miksi poikkeusten käsittely?
  • Poikkeuksia käsittelevät avainsanat
  • Syntaksi:
  • C ++ -standardin poikkeukset
  • Käyttäjän määrittelemät poikkeukset

Miksi poikkeusten käsittely?

Tässä on syy käyttää poikkeusten käsittelyä C ++: ssa:

  • Erotat virhekäsittelykoodisi normaalista koodistasi. Koodi on helpommin luettavissa ja helpompi ylläpitää.
  • Funktiot voivat käsitellä valitsemiaan poikkeuksia. Vaikka funktio heittää monia poikkeuksia, se käsittelee vain joitain. Soittaja käsittelee kiinni jääneet poikkeukset.

Poikkeuksia käsittelevät avainsanat

Poikkeusten käsittely C ++: ssa pyörii näiden kolmen avainsanan ympärillä:

  • heittää - kun ohjelma kohtaa ongelman, se heittää poikkeuksen. Heitto-avainsana auttaa ohjelmaa suorittamaan heiton.
  • catch - ohjelma käyttää poikkeuksen käsittelijää poikkeuksen saamiseksi. Se lisätään ohjelman osioon, jossa sinun on käsiteltävä ongelmaa. Se tehdään saalisavainsanalla.
  • try - try-lohko tunnistaa koodilohkon, jolle tietyt poikkeukset aktivoidaan. Sen jälkeen tulisi olla yksi / useampi saalislohko.

Oletetaan, että koodilohko aiheuttaa poikkeuksen. Poikkeus jää menetelmään, jossa käytetään kokeilun ja saamisen avainsanoja. Try / catch-lohkon tulisi ympäröivät koodi, joka saattaa aiheuttaa poikkeuksen. Tällainen koodi tunnetaan suojattuna koodina.

Syntaksi:

Try / Catch käyttää tätä syntaksia:

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 saalislausekkeita.
  • ExceptionName on pyydettävän poikkeuksen nimi.
  • Poikkeus1, poikkeus2 ja poikkeusN ovat määritettyjä nimiäsi viitataksesi poikkeuksiin.

Esimerkki 1:

#include#includeusing namespace std;int main() {vector vec;vec.push_back(0);vec.push_back(1);// access the third element, which doesn't existtry{vec.at(2);}catch (exception& ex){cout << "Exception occurred!" << endl;}return 0;}

Tuotos:

Tässä on kuvakaappaus koodista:

Koodin selitys:

  1. Sisällytä iostream-otsikkotiedosto ohjelmaan käyttääksesi sen toimintoja.
  2. Lisää vektorin otsikkotiedosto ohjelmaan käyttääksesi sen toimintoja.
  3. Sisällytä vakio nimitila ohjelmassa luokkiinsa kutsumatta sitä.
  4. Kutsu main () -toiminto. Ohjelmalogiikka tulisi lisätä sen runkoon.
  5. Luo vektori nimeltä vec, jotta voit tallentaa kokonaislukutiedot.
  6. Lisää elementti 0 vektoriin nimeltä vec.
  7. Lisää elementti 1 vektoriin nimeltä vec.
  8. Kommentti. C ++-kääntäjä ohittaa sen.
  9. Käytä try-käskyä saadaksesi poikkeuksen. {Merkitsee try / catch-lohkon rungon alkua. Rungossa lisätystä koodista tulee suojattu koodi.
  10. Yritä käyttää vanhemman vektorin hakemistoon 2 (kolmas elementti) tallennettuja elementtejä. Tätä elementtiä ei ole olemassa.
  11. Yritä / kiinni-lohkon rungon pää.
  12. Ota kiinni poikkeuksesta. Palautettu virhesanoma tallennetaan muuttujaan ex.
  13. Tulosta jokin viesti konsolista, jos poikkeus jää kiinni.
  14. Salpalohkon rungon pää.
  15. Ohjelman pitäisi palauttaa arvo suorituksen jälkeen.
  16. Pääfunktion () rungon loppu.

Esimerkki 2:

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

Tuotos:

Tässä on kuvakaappaus koodista:

Koodin selitys:

  1. Sisällytä iostream-otsikkotiedosto ohjelmaan käyttääksesi sen toimintoja.
  2. Sisällytä vakio nimitila ohjelmassa luokkiinsa kutsumatta sitä.
  3. Luo funktio nimeltä zeroDivision, joka vie kaksi kokonaislukua, x ja y. Toiminnon pitäisi antaa kaksinkertainen tulos.
  4. Tarkista if-käskyn avulla, onko muuttujan argumentin y arvo 0. {merkitsee if-rungon alkua.
  5. Palautettava / heitettävä viesti, jos y on 0.
  6. If-lauseen rungon loppu.
  7. ZERODivision-funktion tulisi palauttaa arvo x / y.
  8. ZeroDivision-toiminnon rungon pää.
  9. Kutsu main () -metodi. {Tarkoittaa tämän menetelmän alkua.
  10. Ilmoitetaan kokonaisluku muuttuja ja määritetään sille arvo 11.
  11. Ilmoitetaan kokonaisluku muuttuja b ja määritetään sille arvo 0.
  12. Ilmoitetaan kaksinkertainen muuttuja c ja annetaan sille arvo 0.
  13. Käytä try-käskyä saadaksesi poikkeuksen. {Merkitsee try / catch-lohkon rungon alkua. Rungossa lisätystä koodista tulee suojattu koodi.
  14. Kutsu zeroDivision-funktio ja välitä argumentteihin a ja b, eli 11 ja 0. Tämän operaation tulos tallennetaan muuttujaan c.
  15. Tulosta muuttujan c arvo konsolille.
  16. Yritä / kiinni-lohkon rungon pää.
  17. Ota kiinni poikkeuksesta. Palautettu virhesanoma tallennetaan muuttujaviestiin.
  18. Tulosta palautettu virhesanoma konsolille.
  19. Salpalohkon rungon pää.
  20. Ohjelman pitäisi palauttaa arvo suorituksen jälkeen.
  21. Pääfunktion () rungon loppu.

C ++ -standardin poikkeukset

C ++: n mukana toimitetaan luettelo -luokassa määritellyistä vakiopoikkeuksista. Nämä kuvataan alla:

Poikkeus Kuvaus
std :: poikkeus Tämä on poikkeus ja kaikkien C ++ -standardien poikkeusten pääluokka.
vakio :: huono_alloc Tämä poikkeus johtuu uudesta avainsanasta.
vakio :: huono_cast Tämä on dynaamisen lähetyksen heittämä poikkeus.
vakio :: huono_poikkeus Hyödyllinen laite odottamattomien poikkeusten käsittelemiseen C ++ -ohjelmissa.
vakio :: bad_typeid Typeidin heittämä poikkeus.
vakio :: logiikkavirhe Tämä poikkeus on teoreettisesti havaittavissa lukemalla koodia.
vakio :: verkkotunnuksen_virhe Tämä on poikkeus matemaattisesti virheellisen verkkotunnuksen käytön jälkeen.
vakio :: invalid_argument Virheellisten argumenttien käytöstä tehty poikkeus.
vakio :: pituus_virhe Poikkeus, joka on tehty suuren standardin :: merkkijono luomisen jälkeen.
vakio :: out_of_range Heitetty menetelmän mukaan.
vakio :: ajonaikainen virhe Tämä on poikkeus, jota ei voida tunnistaa lukemalla koodia.
vakio :: ylivuoto_virhe Tämä poikkeus heitetään matemaattisen ylivuoton esiintymisen jälkeen.
vakio :: alue_virhe Tämä poikkeus heitetään, kun yrität tallentaa alueen ulkopuolella olevan arvon.
std :: underflow_error Poikkeus heitetään matemaattisen alivirran esiintymisen jälkeen.

Käyttäjän määrittelemät poikkeukset

C ++ std :: poikkeusluokka antaa meille mahdollisuuden määritellä objekteja, jotka voidaan heittää poikkeuksiksi. Tämä luokka on määritelty otsikossa . Luokka tarjoaa meille virtuaalisen jäsenfunktion nimeltä mitä.

Tämä toiminto palauttaa nollapäätetyn merkkijonon, jonka tyyppi on char *. Voimme korvata sen johdetuissa luokissa, jotta meillä olisi poikkeuksen kuvaus.

Esimerkki:

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

Tuotos:

Tässä on kuvakaappaus koodista:

Koodin selitys:

  1. Sisällytä iostream-otsikkotiedosto ohjelmaamme. Käytämme sen toimintoja saamatta virheitä.
  2. Sisällytä poikkeuksen otsikkotiedosto ohjelmaamme. Käytämme sen toimintoja kuten mitä ilman virheitä.
  3. Sisällytä vakio nimitila ohjelmaamme käyttääksesi luokkia sitä kutsumatta.
  4. Luo uusi luokka nimeltä newException. Tämä luokka perii poikkeusluokan C ++.
  5. Luokkakappaleen alku.
  6. Korvaa virtuaalijäsenfunktio, joka () määritettiin poikkeuksen otsikkotiedostossa. Sitten kuvataan oma poikkeuksemme, uusi poikkeus.
  7. Aloita uuden poikkeuksen määrittely.
  8. Palautettava viesti, jos uusi poikkeus jää kiinni.
  9. Uuden poikkeuksen määritelmän loppu.
  10. Luokan newException rungon loppu. Newex on nimi, jota käytetään uuden poikkeuksemme saamiseen, jonka jälkeen newException kutsutaan.
  11. Kutsu main () -toiminto. Ohjelmalogiikka tulisi lisätä sen runkoon. {Merkitsee rungon alkua.
  12. Käytä try-käskyä merkitsemään koodi, johon meidän on merkittävä poikkeus. {Merkitsee try / catch-lohkon rungon alkua. Tämän ympäröimä koodi suojautuu.
  13. Heitä newex-poikkeus, jos se on kiinni.
  14. Kokeilurungon loppu.
  15. Käytä saalislauseketta saadaksesi poikkeuksen kiinni. Poikkeuksen virheilmoitus tallennetaan muuttujaan ex.
  16. Tulosta poikkeusvirhesanoma konsolille.
  17. Saalisilmoituksen loppu.
  18. Ohjelman tulisi palauttaa arvo, jos se suoritetaan onnistuneesti.
  19. Pääfunktion () rungon pää.

Yhteenveto:

  • Poikkeusten käsittelyä C ++: ssa voit käsitellä ajonaikaiset virheet.
  • Suorituksenaikaiset virheet ovat virheitä, jotka tapahtuvat ohjelman suorituksen aikana.
  • Poikkeusten käsittely auttaa sinua käsittelemään kaikki odottamattomat olosuhteet ohjelmassa.
  • Odottamattoman tilanteen sattuessa ohjelman hallinta siirtyy käsittelijöille.
  • Poikkeuksen saamiseksi sijoita koodiosa try-catch-lohkon alle.
  • Heitto-avainsana auttaa ohjelmaa heittämään poikkeuksia, mikä auttaa ohjelmaa käsittelemään ongelmaa.
  • Kokeile avainsana auttaa tunnistamaan koodilohkon, jolle tietyt poikkeukset aktivoidaan.
  • Voimme korvata poikkeuksen otsikkotiedoston what () -funktion määrittelemään poikkeuksemme.