C ++

Išimčių tvarkymas C ++

Išimčių tvarkymas C ++
Yra trijų tipų programinės įrangos klaidos. Tai yra sintaksės klaidos, logikos klaidos ir vykdymo laiko klaidos.

Sintaksės klaidos

Neteisingai įrašyta išraiška, sakinys ar konstrukcija yra sintaksės klaida.

Apsvarstykite šiuos du teiginius:

int arr [] = 1, 2, 3; // pataisyti
int arr = 1, 2, 3; // sintaksės klaida, trūksta []

Jie yra tos pačios masyvo apibrėžimai. Pirmasis yra teisingas. Antrojo trūksta [], tai yra sintaksės klaida. Nepavyksta sukompiliuoti programos su sintaksės klaida. Kompiliacija nepavyksta su klaidos pranešimu, nurodančiu sintaksės klaidą. Gerai tai, kad sintaksės klaidą visada galima ištaisyti, jei programuotojas žino, ką daro.

Logikos klaida

Loginė klaida yra programuotojo padaryta klaida, kai padaromas neteisingas loginis kodavimas. Tai gali būti programuotojo nežinojimo dėl programavimo kalbos ypatybių arba nesusipratimo, ką programa turėtų padaryti, rezultatas.

Esant tokiai situacijai, programa sudaroma sėkmingai. Programa veikia gerai, tačiau jos rezultatai neteisingi. Tokia klaida gali būti dėl to, kad padarius kilpą kartoti 5 kartus, kai ji kartojama 10 kartų. Taip pat gali būti, kad nesąmoningai daroma kilpa be galo kartotis. Vienintelis būdas išspręsti šios rūšies klaidas yra kruopštus programavimas ir kruopštus programos patikrinimas prieš perduodant ją klientui.

Klaida vykdymo metu

Neteisingi ar išskirtiniai įvedimai sukelia vykdymo laiko klaidas. Šiuo atveju programa buvo sėkmingai sukompiliuota ir gerai veikia daugelyje situacijų. Tam tikrose situacijose programa užstringa (ir sustoja).

Įsivaizduokite, kad programos kodo segmente 8 turi būti padalinta iš daugybės vardiklių. Taigi, jei skaitiklis 8 padalytas iš vardiklio 4, atsakymas (koeficientas) būtų 2. Tačiau jei vartotojas įveda vardiklį 0, programa sugenda. Matematikoje negalima dalyti iš 0, taip pat neleidžiama skaičiuojant. Programuojant reikėtų užkirsti kelią dalybai pagal nulį. Išimčių tvarkymas apdoroja vykdymo laiko klaidas, pvz., Padalijimą pagal nulį. Ši programa parodo, kaip tvarkyti padalijimo iki nulio problemą nenaudojant išimties funkcijos C ++:

# įtraukti
naudojant vardų sritį std;
int main ()

int skaitiklis = 8;
int vardiklis = 2;
jei (vardiklis != 0)

int rezultatas = skaitiklis / vardiklis;
cout << result << '\n';

Kitas

cout << "Division by zero is not permitted!" << '\n';

grąžinti 0;

Išvestis yra 4. Jei vardiklis būtų 0, išvestis būtų buvusi:

„Dalytis iš nulio neleidžiama!“

Pagrindinis kodas yra „if-else“ konstruktas. Jei vardiklis nėra 0, dalijimasis vyks; jei jis yra 0, padalijimas neįvyks. Vartotojui bus išsiųstas klaidos pranešimas, o programa toliau veiks be strigčių. Klaida paprastai vykdoma vengiant kodo segmento vykdymo ir siunčiant klaidos pranešimą vartotojui.

Išimties funkcija „C ++“ naudoja bandomąjį bloką „if-block“ ir „catch-block“ bloką „else-block“, kad pašalintų klaidą, taip:

# įtraukti
naudojant vardų sritį std;
int main ()

int skaitiklis = 8;
int vardiklis = 2;
bandyti

jei (vardiklis != 0)

int rezultatas = skaitiklis / vardiklis;
cout << result << '\n';

Kitas

metimas 0;


sugauti (klysti)

jei (klaida == 0)
cout << "Division by zero is not permitted!" << '\n';

grąžinti 0;

Atminkite, kad bandymo antraštėje nėra argumento. Taip pat atkreipkite dėmesį, kad fiksavimo blokas, kuris yra tarsi funkcijos apibrėžimas, turi parametrą. Parametrų tipas turi būti toks pat kaip metimo išraiškos operandas (argumentas). Metimo išraiška yra bandymo bloke. Jis išmeta argumentą apie programuotojo pasirinkimą, kuris yra susijęs su klaida, ir „catch-block“ ją sugauna. Tokiu būdu bandomasis blokas kodas nėra vykdomas. Tada fiksavimo bloke rodomas klaidos pranešimas.

Šiame straipsnyje paaiškinamas išimčių tvarkymas C++. Pagrindinės žinios C ++ kalba yra būtina sąlyga, kad skaitytojas suprastų šį straipsnį.

Straipsnio turinys:

  • Funkcija išmetimas
  • Vienam bandymui blokuoti yra daugiau nei vienas blokavimo blokas
  • Lizdai bando / gaudo blokus
  • noexcept-specifikatorius
  • Funkcija Specialioji std :: terminate ()
  • Išvada

Funkcija, išmetanti išimtį:

Funkcija taip pat gali sukelti išimtį, kaip ir tai, ką daro „try-block“. Metimas vyksta apibrėžiant funkciją. Tai iliustruoja ši programa:

# įtraukti
naudojant vardų sritį std;
negaliojantis fn (const char * str)

jei (islower (str [0]))
mesti „l“;

int main ()

bandyti

fn („kalvis“);

pagauti (char ch)

jei (ch == 'l')
cout << "Person's name cannot begin in lowercase!" << '\n';

grąžinti 0;

Atkreipkite dėmesį, kad šį kartą bandymo bloke yra tik funkcijos iškvietimas. Tai yra vadinamoji funkcija, turinti metimo operaciją. Gaudymo blokas gaudo išimtį, o rezultatas yra:

„Asmens vardas negali prasidėti mažosiomis raidėmis!“

Šį kartą metamas ir pagautas tipas yra char.

Vienam bandymui blokuoti yra daugiau nei vienas blokavimo blokas:

Vienam bandymui blokuoti gali būti daugiau nei vienas blokavimo blokas. Įsivaizduokite situaciją, kai įvestis gali būti bet kuris iš klaviatūros simbolių, bet ne skaitmuo ir ne abėcėlė. Tokiu atveju turi būti du blokavimo blokai: vienas sveikam skaičiui patikrinti, o antrasis - abėcėlės ženklui. Tai iliustruoja šis kodas:

# įtraukti
naudojant vardų sritį std;
char įvestis = '*';
int main ()

bandyti

jei (isdigit (įvestis))
mesti 10;
jei (isalpha (įvestis))
mesti „z“;

pagauti (int)

cout << "Digit input is forbidden!" << '\n';

pagauti (char)

cout << "Character input is forbidden!" << '\n';

grąžinti 0;

Nėra išvesties. Jei įvesties vertė būtų skaitmuo, el.g., „1“, išvestis būtų buvusi:

"Draudžiama įvesti skaitmenis!"

Jei įvesties vertė būtų abėcėlė, el.g., „a“, išvestis būtų buvusi:

"Draudžiama įvesti simbolius!"

Atkreipkite dėmesį, kad dviejų sugavimo blokų parametrų sąraše nėra identifikatoriaus pavadinimo. Taip pat atkreipkite dėmesį, kad apibrėžiant du blokavimo blokus, konkretūs pateikti argumentai nebuvo patikrinti, ar jų vertės yra tikslios, ar ne.

Svarbus laimikiui yra rūšis; laimikis turi atitikti išmesto operando tipą. Tam tikra metamo argumento (operando) vertė gali būti naudojama tolesniam patikrinimui, jei reikia.

Daugiau nei vienas tos pačios rūšies tvarkytuvas

Galima turėti du to paties tipo prižiūrėtojus. Kai išmetama išimtis, valdymas perduodamas artimiausiam tvarkytojui su atitinkančiu tipu. Tai iliustruoja ši programa:

# įtraukti
naudojant vardų sritį std;
char įvestis = '1';
int main ()

bandyti

jei (isdigit (įvestis))
mesti 10;

pagauti (int)

cout << "Digit input is forbidden!" << '\n';

pagauti (int)

cout << "Not allowed at all: digit input!" << '\n';

grąžinti 0;

Rezultatas yra:

"Draudžiama įvesti skaitmenis!"

Įdėti bandymo / gaudymo blokai:

try / catch blokai gali būti įdėti. Aukščiau nurodyta programa, skirta ne raidiniams ir skaitiniams simboliams įvesti iš klaviatūros, čia pakartojama, tačiau įterpiamas abėcėlės klaidos kodas:

# įtraukti
naudojant vardų sritį std;
char įvestis = '*';
int main ()

bandyti

jei (isdigit (įvestis))
mesti 10;
bandyti

jei (isalpha (įvestis))
mesti „z“;

pagauti (char)

cout << "Character input is forbidden!" << '\n';


pagauti (int)

cout << "Digit input is forbidden!" << '\n';

grąžinti 0;

Klaidų abėcėlės bandymo / gaudymo blokas yra įdėtas į skaitmenų kodo bandymo bloką. Šios programos veikimas ir ankstesnė operacija, iš kurios ji nukopijuota, yra tas pats.

noexcept-specifikatorius

Apsvarstykite šią funkciją:

void fn (const char * str) noexcept

jei (islower (str [0]))
mesti „l“;

Atkreipkite dėmesį į specifikatorių „noexcept“ iškart po dešiniuoju skliaustu funkcijos parametrų sąraše. Tai reiškia, kad funkcija neturėtų būti išimtis. Jei funkcija sukuria išimtį, kaip šiuo atveju, ji bus sukompiliuota su įspėjamuoju pranešimu, bet nebus vykdoma. Bandymas paleisti programą iškvies specialiąją funkciją „std :: terminate ()“, kuri turėtų grakščiai sustabdyti programą, užuot leidusi tiesiog pažodžiui sudužti.

„Noexcept“ specifikatorius yra skirtingų formų. Tai yra šie:

įveskite func () noexcept; : neleidžia mesti išraiškos
įveskite func () noexcept (true); : leidžia mesti išraišką
tipo func () metimas (); : neleidžia mesti išraiškos
įveskite func () noexcept (false); : leidžia mesti išraišką, kuri yra neprivaloma
įveskite func (); : leidžia mesti išraišką, kuri yra neprivaloma

skliaustuose teisinga ar klaidinga gali būti pakeista išraiška, kurios rezultatas yra teisinga arba klaidinga.

Specialioji std :: terminate () funkcija:

Jei išimtis negali būti tvarkoma, ją reikia išmesti iš naujo. Tokiu atveju metama išraiška gali turėti operandą arba jo neturėti. Vykdymo metu bus iškviesta specialioji funkcija std :: terminate (), kuri turėtų grakščiai sustabdyti programą, užuot leidusi tiesiog pažodžiui sudužti.

Įveskite, sukompiliuokite ir paleiskite šią programą:

# įtraukti
naudojant vardų sritį std;
char įvestis = '1';
int main ()

bandyti

jei (isdigit (įvestis))
mesti 10;

pagauti (int)

mesti;

grąžinti 0;

Po sėkmingo kompiliavimo programa buvo nutraukta nevykdant, o klaidos pranešimas iš autoriaus kompiuterio:

„Nutraukti skambutį išmetus„ int “egzempliorių

Nutrauktas (šerdis išmestas) “

Išvada:

Išimties funkcija C ++ neleidžia kodo segmento vykdyti pagal tam tikrą įvestį. Prireikus programa toliau vykdoma. Išimties (klaidų prevencijos) konstrukcija susideda iš bandymo ir blokavimo. Bandomasis blokas turi dominantį kodo segmentą, kurį galima apeiti, priklausomai nuo įvesties sąlygų. Try-block turi metimo išraišką, kuri išmeta operandą. Šis operandas dar vadinamas išimtimi. Jei operando tipas ir sugavimo bloko parametro tipas yra vienodi, tada išimtis sugaunama (tvarkoma). Jei išimtis nebus sugauta, programa bus nutraukta, tačiau vis tiek bus saugi, nes nebuvo įvykdytas kodo segmentas, kurį reikėjo vykdyti, kad gautų neteisingą rezultatą. Tipiškas išimčių tvarkymas reiškia kodo segmento apėjimą ir klaidos pranešimo siuntimą vartotojui. Kodo segmentas vykdomas normaliam įvedimui, bet apeinamas dėl neteisingų įvesties.

Kaip pakeisti kairįjį ir dešinįjį pelės mygtukus „Windows 10“ kompiuteryje
Gana įprasta, kad visi kompiuterio pelės įrenginiai yra ergonomiškai sukurti dešiniarankiams. Tačiau yra pelių prietaisų, specialiai sukurtų kairiaran...
Mėgdžiokite pelės paspaudimus, užveskite pelės žymeklį naudodami pelę „Clickless Mouse“ sistemoje „Windows 10“
Pelės ar klaviatūros naudojimas netinkamoje laikysenoje, kai naudojama per daug, gali sukelti daug sveikatos problemų, įskaitant įtampą, riešo kanalo ...
Pridėkite pelės gestus prie „Windows 10“ naudodami šiuos nemokamus įrankius
Pastaraisiais metais kompiuteriai ir operacinės sistemos labai išsivystė. Buvo laikas, kai vartotojai turėjo naudoti komandas naršydami per failų tvar...