C++ Erandi käsitlemine: proovige, püüdke, visake näide

⚡ Nutikas kokkuvõte

Erandi käsitlemine C++ võimaldab programmil tuvastada ja reageerida käitusaja vigadele käskude try, catch ja throw abil, et see krahhi ei satuks. Siit saate teada märksõnu, süntaksit, standardseid erandeid ja kasutaja määratletud erandeid koos näidetega.

  • ⚠️ Mis see on: Erandite käsitlemine püüab kinni käitusaja vead, et programm saaks taastuda.
  • 🔑 Märksõnad: See kasutab koodi testimiseks try'd, tõstmiseks throw'd ja vigade käsitlemiseks catch'i.
  • 🧾 süntaksit: Pane riskantne kood try-plokki ja käsitle vigu catch-plokkides.
  • 📚 Standardsed erandid: C++ pakub erandite päises sisseehitatud erandeid.
  • 🤖 Tehisintellekti abi: Tehisintellekti tööriistad, näiteks GitHub Copilot, lisavad proovipüüdmise plokke ja veakäsitlust.

C++ Välja arvatud käitlemine

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:

Erandite käsitlemise märksõnad

Siin on koodi ekraanipilt:

Erandite käsitlemise märksõnad

Code Selgitus:

  1. Lisage selle kasutamiseks programmi iostream päisefail funktsioonid.
  2. Selle funktsioonide kasutamiseks lisage programmi vektorpäise fail.
  3. Kaasake programmi std nimeruum selle klassidesse ilma seda kutsumata.
  4. Kutsuge funktsioon main(). Programmi loogika tuleks lisada selle kehasse.
  5. Täisarvuandmete salvestamiseks looge vektor nimega vec.
  6. Lisage vektorile nimega vec element 0.
  7. Lisage vektorile nimega vec element 1.
  8. Kommentaar. Selle jätab vahele C++ kompilaator.
  9. Kasutage erandi tabamiseks käsku try. { märgib try/catch ploki kehaosa algust. Kehasse lisatud koodist saab kaitstud kood.
  10. Proovige pääseda juurde vektori nimega vec indeksis 2 (kolmas element) talletatud elemendile. Seda elementi pole olemas.
  11. Proovi/püüdmise ploki keha lõpp.
  12. Püüdke erand. Tagastatud veateade salvestatakse muutujasse ex.
  13. Kui erand tabatakse, printige konsoolil välja mõni teade.
  14. Püügiploki korpuse ots.
  15. Programm peaks eduka täitmise korral tagastama väärtuse.
  16. 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:

Erandite käsitlemise märksõnad

Siin on koodi ekraanipilt:

Erandite käsitlemise märksõnad

Code Selgitus:

  1. Selle funktsioonide kasutamiseks lisage programmi iostreami päisefail.
  2. Kaasake programmi std nimeruum selle klassidesse ilma seda kutsumata.
  3. Looge funktsioon nimega zeroDivision, mis võtab kaks täisarvu argumenti x ja y. Funktsioon peaks tagastama topelttulemuse.
  4. Kasutage if-lauset, et kontrollida, kas muutuja argumendi y väärtus on 0. { märgib if-i keha algust.
  5. Tagastatav/visatav sõnum, kui y on 0.
  6. Kui-lause põhiosa lõpp.
  7. Funktsioon zeroDivision peaks tagastama x/y väärtuse.
  8. Funktsiooni zeroDivision keha lõpp.
  9. Kutsuge välja main() meetod. { tähistab selle meetodi algust.
  10. Deklareerige täisarvuline muutuja ja määrake sellele väärtus 11.
  11. Deklareerige täisarvuline muutuja b ja määrake sellele väärtus 0.
  12. Deklareerige topeltmuutuja c ja määrake sellele väärtus 0.
  13. Kasutage erandi tabamiseks käsku try. { märgib try/catch ploki kehaosa algust. Kehasse lisatud koodist saab kaitstud kood.
  14. Kutsuge funktsioon zeroDivision ja edastage argumentidele a ja b, st 11 ja 0. Selle toimingu tulemus salvestatakse muutujasse c.
  15. Printige konsoolil välja muutuja c väärtus.
  16. Proovi/püüdmise ploki keha lõpp.
  17. Püüdke erand. Tagastatud veateade salvestatakse muutujateatesse.
  18. Printige konsoolist välja tagastatud veateade.
  19. Püügiploki korpuse ots.
  20. Programm peaks eduka täitmise korral tagastama väärtuse.
  21. Funktsiooni main() keha lõpp.

C++ Tavalised erandid

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:

Kasutaja määratud erandid

Siin on koodi ekraanipilt:

Kasutaja määratud erandid

Code Selgitus:

  1. Kaasake iostreami päisefail meie programmi. Kasutame selle funktsioone ilma vigadeta.
  2. Kaasake erandi päise fail meie programmi. Kasutame selle funktsioone nagu mida ilma vigadeta.
  3. Lisage meie programmi std nimeruum, et kasutada selle klasse ilma seda kutsumata.
  4. Looge uus klass nimega newException. See klass pärib erandklassi C++.
  5. Klassi keha algus.
  6. Kirjutage üle erandi päise failis määratletud virtuaalse liikme funktsioon what(). Seejärel kirjeldame oma erandit, uut erandit.
  7. Alustage uue erandi määratlemist.
  8. Uue erandi tabamisel tagastatav sõnum.
  9. Uue erandi määratluse lõpp.
  10. Klassi põhiteksti lõpp uusErand. Uusex on nimi, mida kasutatakse meie uue erandi püüdmiseks, mille järgi kutsutakse uut erandit.
  11. Kutsuge välja funktsioon main(). Programmi loogika tuleks lisada selle kehasse. { tähistab selle keha algust.
  12. Kasutage proovilauset, et märkida kood, mille sees peame erandi märkima. { märgib try/catch ploki kehaosa algust. Sellega ümbritsetud kood muutub kaitstuks.
  13. Viska uusexi erand, kui see kinni püütakse.
  14. Katsekeha lõpp.
  15. Kasutage erandi tabamiseks püüdmislauset. Erandi veateade salvestatakse muutujasse ex.
  16. Printige konsoolile erandi veateade.
  17. Püügilause kehaosa lõpp.
  18. Programm peaks eduka käivitamise korral tagastama väärtuse.
  19. Funktsiooni main() keha lõpp.

KKK

Erandite käsitlemine on viis käitusaja vigade tuvastamiseks ja neile reageerimiseks C++ kasutades märksõnu try, throw ja catch, et programm saaks krahhi asemel taastuda.

C++ kasutab kolme märksõna: try mähib koodi, mis võib nurjuda, throw tekitab vea ilmnemisel erandi ja catch tegeleb visatud erandiga.

Aseta riskantne kood try-plokki, millele järgneb üks või mitu catch-plokki, millest igaüks käsitleb try-plokist visatud kindlat eranditüüpi.

Standardsed erandid on sisseehitatud erandite klassid erandite päises, näiteks std::bad_alloc ja std::out_of_range, mis teatavad levinud käitusaja vigadest.

Kasutaja määratletud erand on kohandatud klass, mis on sageli tuletatud funktsioonist std::exception ja mis alistab funktsiooni what() teie enda määratletud veatingimuse kirjeldamiseks.

Tehisintellekti assistendid, näiteks GitHub Copilot, pakivad riskantseid koode try-catch plokkidesse, genereerivad kohandatud erandite klasse ja pakuvad tippimise ajal välja, milliseid erandeid püüda.

Jah. Tehisintellektil põhinevad tööriistad tuvastavad käsitlemata erandeid, pakuvad üldiste asemel konkreetseid püügiblokke ja lisavad sisukaid veateateid, muutes teie C++ kood on robustsem.

`throw` tekitab vea tuvastamisel erandi, `catch` aga saab selle erandi ja käivitab koodi, mis veaga tegeleb või sellest teatab.

Võta see postitus kokku järgmiselt: