C++ Erandi käsitlemine: proovige, püüdke, visake näide
Mis on erandite käsitlemine C++?
Erandi käsitlemine C++ pakub teile viisi ootamatute olukordade, nagu käitusaja vead, käsitlemiseks. Nii et kui juhtub ootamatu olukord, kantakse programmi juhtimine üle erifunktsioonidele, mida nimetatakse töötlejateks.
Erandite tuvastamiseks asetate mõne koodiosa erandi kontrolli alla. Koodiosa paigutatakse try-catch plokki.
Kui selles koodiosas tekib erandlik olukord, tehakse erand. Järgmisena võtab erandite töötleja programmi juhtimise üle.
Kui erakorralisi asjaolusid ei esine, käivitub kood normaalselt. Käitlejaid ignoreeritakse.
Selle C++ õpetusest saate teada:
Miks erandite käsitlemine?
Siin on põhjus erandite käsitlemise kasutamiseks C++:
- Eraldate oma veakäsitluskoodi tavalisest koodist. Kood on loetavam ja hõlpsamini hooldatav.
- Funktsioonid saavad hakkama nende valitud eranditega. Isegi kui funktsioon teeb palju erandeid, käsitleb see ainult mõnda. Tabamata eranditega tegeleb helistaja.
Erandite käsitlemise märksõnad
Erandi käsitlemine C++ keerleb nende kolme märksõna ümber:
- viskama– kui programmil tekib probleem, teeb see erandi. Viska märksõna aitab programmil viset sooritada.
- saak– programm kasutab erandi püüdmiseks erandikäsitlejat. See lisatakse programmi jaotisesse, kus peate probleemiga tegelema. Seda tehakse püüdmissõna abil.
- püüdma– prooviplokk tuvastab koodiploki, mille jaoks aktiveeritakse teatud erandid. Sellele peaks järgnema üks/mitu püügiplokki.
Oletame, et koodiplokk tekitab erandi. Erandi tabab meetod, mis kasutab proovi ja püüdmise märksõnu. Try/catch plokk peaks ümbritsema koodi, mis võib teha erandi. Sellist koodi nimetatakse kaitstud koodiks.
Süntaks
Try/catch võtab järgmise süntaksi:
try { // the protected code } catch( Exception_Name exception1 ) { // catch block } catch( Exception_Name exception2 ) { // catch block } catch( Exception_Name exceptionN ) { // catch block }
- Kuigi meil on üks proovilause, võib meil olla palju tabavaid väiteid.
- ExceptionName on püütava erandi nimi.
- Erand1, erand2 ja erandN on teie määratletud nimed eranditele viitamiseks.
Näide 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; }
Väljund:
Siin on koodi ekraanipilt:
Koodi selgitus:
- Lisage selle kasutamiseks programmi iostream päisefail funktsioonid.
- Selle funktsioonide kasutamiseks lisage programmi vektorpäise fail.
- Kaasake programmi std nimeruum selle klassidesse ilma seda kutsumata.
- Kutsuge funktsioon main(). Programmi loogika tuleks lisada selle kehasse.
- Täisarvuandmete salvestamiseks looge vektor nimega vec.
- Lisage vektorile nimega vec element 0.
- Lisage vektorile nimega vec element 1.
- Kommentaar. Selle jätab vahele C++ kompilaator.
- Kasutage erandi tabamiseks käsku try. { märgib try/catch ploki kehaosa algust. Kehasse lisatud koodist saab kaitstud kood.
- Proovige pääseda juurde vektori nimega vec indeksis 2 (kolmas element) talletatud elemendile. Seda elementi pole olemas.
- Proovi/püüdmise ploki keha lõpp.
- Püüdke erand. Tagastatud veateade salvestatakse muutujasse ex.
- Kui erand tabatakse, printige konsoolil välja mõni teade.
- Püügiploki korpuse ots.
- Programm peaks eduka täitmise korral tagastama väärtuse.
- Funktsiooni main() keha lõpp.
Näide 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; }
Väljund:
Siin on koodi ekraanipilt:
Koodi selgitus:
- Selle funktsioonide kasutamiseks lisage programmi iostreami päisefail.
- Kaasake programmi std nimeruum selle klassidesse ilma seda kutsumata.
- Looge funktsioon nimega zeroDivision, mis võtab kaks täisarvu argumenti x ja y. Funktsioon peaks tagastama topelttulemuse.
- Kasutage if-lauset, et kontrollida, kas muutuja argumendi y väärtus on 0. { märgib if-i keha algust.
- Tagastatav/visatav sõnum, kui y on 0.
- Kui-lause põhiosa lõpp.
- Funktsioon zeroDivision peaks tagastama x/y väärtuse.
- Funktsiooni zeroDivision keha lõpp.
- Kutsuge välja main() meetod. { tähistab selle meetodi algust.
- Deklareerige täisarvuline muutuja ja määrake sellele väärtus 11.
- Deklareerige täisarvuline muutuja b ja määrake sellele väärtus 0.
- Deklareerige topeltmuutuja c ja määrake sellele väärtus 0.
- Kasutage erandi tabamiseks käsku try. { märgib try/catch ploki kehaosa algust. Kehasse lisatud koodist saab kaitstud kood.
- Kutsuge funktsioon zeroDivision ja edastage argumentidele a ja b, st 11 ja 0. Selle toimingu tulemus salvestatakse muutujasse c.
- Printige konsoolil välja muutuja c väärtus.
- Proovi/püüdmise ploki keha lõpp.
- Püüdke erand. Tagastatud veateade salvestatakse muutujateatesse.
- Printige konsoolist välja tagastatud veateade.
- Püügiploki korpuse ots.
- Programm peaks eduka täitmise korral tagastama väärtuse.
- Funktsiooni main() keha lõpp.
C++ Tavalised erandid
C++ kaasas standardsete erandite loend, mis on määratletud punktis klass. Neid kirjeldatakse allpool:
Erand | Kirjeldus |
---|---|
std::erand | See on erand ja kõigi standardite vanemklass C++ erandeid. |
std::bad_alloc | Selle erandi teeb uus märksõna. |
std::bad_cast | See on erand, mille teeb dynamic_cast. |
std::bad_erand | Kasulik seade ootamatute erandite käsitlemiseks C++ programme. |
std::bad_typeid | Typeidi poolt visatud erand. |
std::loogika_viga | See erand on teoreetiliselt tuvastatav koodi lugemisega. |
std::domain_error | See on erand, mis tehakse pärast matemaatiliselt kehtetu domeeni kasutamist. |
std::invalid_argument | Erand tehti kehtetute argumentide kasutamise tõttu. |
std::length_error | Erand, mis tehakse pärast suure std::stringi loomist. |
std::vahemikust_väljas | Visatud meetodiga. |
std::runtime_error | See on erand, mida ei saa koodi lugemise abil tuvastada. |
std::overflow_error | See erand tehakse pärast matemaatilise ülevoolu esinemist. |
std::vahemiku_viga | See erand tehakse siis, kui proovite salvestada vahemikust väljapoole jäävat väärtust. |
std::underflow_error | Erand, mis on tehtud pärast matemaatilise alavoolu ilmnemist. |
Kasutaja määratud erandid
. C++ std::exception klass võimaldab meil määratleda objekte, mida saab eranditena visata. See klass on määratletud dokumendis päis. Klass pakub meile virtuaalse liikme funktsiooni nimega what.
See funktsioon tagastab null-lõpuga märgijada tüübiga char *. Erandite kirjelduse saamiseks saame selle tuletatud klassides üle kirjutada.
Näide:
#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; }
Väljund:
Siin on koodi ekraanipilt:
Koodi selgitus:
- Kaasake iostreami päisefail meie programmi. Kasutame selle funktsioone ilma vigadeta.
- Kaasake erandi päise fail meie programmi. Kasutame selle funktsioone nagu mida ilma vigadeta.
- Lisage meie programmi std nimeruum, et kasutada selle klasse ilma seda kutsumata.
- Looge uus klass nimega newException. See klass pärib erandklassi C++.
- Klassi keha algus.
- Kirjutage üle erandi päise failis määratletud virtuaalse liikme funktsioon what(). Seejärel kirjeldame oma erandit, uut erandit.
- Alustage uue erandi määratlemist.
- Uue erandi tabamisel tagastatav sõnum.
- Uue erandi määratluse lõpp.
- Klassi põhiteksti lõpp uusErand. Uusex on nimi, mida kasutatakse meie uue erandi püüdmiseks, mille järgi kutsutakse uut erandit.
- Kutsuge välja funktsioon main(). Programmi loogika tuleks lisada selle kehasse. { tähistab selle keha algust.
- Kasutage proovilauset, et märkida kood, mille sees peame erandi märkima. { märgib try/catch ploki kehaosa algust. Sellega ümbritsetud kood muutub kaitstuks.
- Viska uusexi erand, kui see kinni püütakse.
- Katsekeha lõpp.
- Kasutage erandi tabamiseks püüdmislauset. Erandi veateade salvestatakse muutujasse ex.
- Printige konsoolile erandi veateade.
- Püügilause kehaosa lõpp.
- Programm peaks eduka käivitamise korral tagastama väärtuse.
- Funktsiooni main() keha lõpp.
kokkuvõte
- Välja arvatud sissekäimine C++, saate käitusaja vigadega hakkama.
- Käitusvead on vead, mis ilmnevad programmi täitmisel.
- Erandite käsitlemine aitab teil toime tulla kõigi ootamatute asjaoludega teie programmis.
- Ootamatu asjaolu ilmnemisel antakse programmi juhtimine üle töötlejatele.
- Erandi tabamiseks asetate koodilõigu try-catch ploki alla.
- Viska märksõna aitab programmil erandeid visata, aidates programmil probleemiga toime tulla.
- Märksõna try aitab tuvastada koodiploki, mille jaoks teatud erandid aktiveeritakse.
- Erandite määratlemiseks saame erandi päisefaili funktsiooni what() üle kirjutada.