C ++

Poikkeusten käsittely C ++ ssa

Poikkeusten käsittely C ++ ssa
Ohjelmistovirheitä on kolmenlaisia. Nämä ovat syntaksivirheitä, logiikkavirheitä ja ajonaikaisia ​​virheitä.

Syntaksivirheet

Väärin kirjoitettu lauseke, lause tai rakenne on syntaksivirhe.

Harkitse seuraavia kahta lausetta:

int arr [] = 1, 2, 3; //oikea
int arr = 1, 2, 3; // syntaksivirhe, puuttuu []

Ne ovat saman taulukon määritelmiä. Ensimmäinen on oikea. Toinen puuttuu [], ja se on syntaksivirhe. Syntaksivirhettä sisältävää ohjelmaa ei voida kääntää. Kokoaminen epäonnistuu virheilmoituksella, joka osoittaa syntaksivirheen. Hyvä asia on, että syntaksivirhe voidaan aina korjata, jos ohjelmoija tietää mitä tekee.

Looginen virhe

Looginen virhe on virhe, jonka ohjelmoija on tehnyt väärän loogisen koodauksen yhteydessä. Se voi johtua ohjelmoijan tietämättömyydestä ohjelmointikielen ominaisuuksiin tai väärinkäsityksestä siitä, mitä ohjelman pitäisi tehdä.

Tässä tilanteessa ohjelma on laadittu onnistuneesti. Ohjelma toimii hyvin, mutta se tuottaa vääriä tuloksia. Tällainen virhe voi johtua silmukan iteroinnista 5 kertaa, kun se tehdään iteroimaan 10 kertaa. Voi myös olla, että silmukka tehdään tiedostamattomasti toistumaan loputtomasti. Ainoa tapa ratkaista tällainen virhe on tehdä huolellinen ohjelmointi ja testata ohjelma perusteellisesti ennen sen luovuttamista asiakkaalle.

Suorituksenaikaiset virheet

Väärät tai poikkeukselliset syötteet aiheuttavat ajonaikaisia ​​virheitä. Tässä tapauksessa ohjelma käännettiin onnistuneesti ja se toimii hyvin monissa tilanteissa. Tietyissä tilanteissa ohjelma kaatuu (ja pysähtyy).

Kuvittele, että ohjelmakoodisegmentissä 8 on jaettava useilla nimittäjillä. Joten jos osoittaja 8 jaetaan nimittäjällä 4, vastaus (osamäärä) olisi 2. Jos käyttäjä syöttää nimittäjäksi 0, ohjelma kaatuu. Jakaminen 0: lla ei ole sallittua matematiikassa, eikä se ole myöskään sallittua laskennassa. Jako nollalla pitäisi estää ohjelmoinnissa. Poikkeusten käsittely käsittelee ajonaikaiset virheet, kuten jakaminen nollalla. Seuraava ohjelma näyttää, miten nollatasolla jakamisen ongelma käsitellään käyttämättä C ++: n poikkeustoimintoa:

#sisältää
käyttämällä nimitilaa vakio;
int main ()

int-osoitin = 8;
int nimittäjä = 2;
jos (nimittäjä != 0)

int tulos = osoittaja / nimittäjä;
cout << result << '\n';

muu

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

paluu 0;

Lähtö on 4. Jos nimittäjä olisi 0, tulos olisi ollut:

”Nollalla jakaminen ei ole sallittua!”

Pääkoodi on tässä if-else -rakenne. Jos nimittäjä ei ole 0, jako tapahtuu; jos se on 0, jakamista ei tapahdu. Käyttäjälle lähetetään virheilmoitus, ja ohjelma jatkuu kaatumasta. Ajonaikaiset virheet käsitellään yleensä välttämällä koodisegmentin suorittamista ja lähettämällä virheilmoitus käyttäjälle.

C ++: n poikkeusominaisuus käyttää try-blockia if-lohkossa ja catch-blockia muussa lohkossa virheen käsittelemiseksi, seuraavasti:

#sisältää
käyttämällä nimitilaa vakio;
int main ()

int-osoitin = 8;
int nimittäjä = 2;
yrittää

jos (nimittäjä != 0)

int tulos = osoittaja / nimittäjä;
cout << result << '\n';

muu

heittää 0;


saalis (er err)

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

paluu 0;

Huomaa, että try-otsikossa ei ole argumenttia. Huomaa myös, että salauslohkolla, joka on kuin toimintomääritelmä, on parametri. Parametrin tyypin on oltava sama kuin heittolausekkeen operandi (argumentti). Heittolauseke on try-blockissa. Se heittää argumentin ohjelmoijan valinnasta, joka liittyy virheeseen, ja salpalohko tarttuu siihen. Tällä tavalla try-block-koodia ei suoriteta. Sitten salpalohko näyttää virheilmoituksen.

Tässä artikkelissa selitetään poikkeusten käsittely C: ssä++. Perustiedot C ++: ssa ovat edellytys sille, että lukija ymmärtää tämän artikkelin.

Artikkelin sisältö:

  • Toiminto heittää poikkeuksen
  • Useampi kuin yksi saalislohko yhdelle kokeilulohkolle
  • Sisäkkäin yritetty / kiinni lohkot
  • noexcept-specifier
  • Special std :: terminate () -toiminto
  • Johtopäätös

Toiminto heittää poikkeus:

Toiminto voi myös heittää poikkeuksen, kuten try-block. Heitto tapahtuu toiminnon määritelmän sisällä. Seuraava ohjelma kuvaa tätä:

#sisältää
käyttämällä nimitilaa vakio;
void fn (const char * str)

jos (islower (str [0]))
heittää 'l';

int main ()

yrittää

fn ("seppä");

saalis (char ch)

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

paluu 0;

Huomaa, että tällä kertaa kokeilulohkolla on vain toimintokutsu. Nimeltään funktiolla on heittotoiminto. Saalislohko tarttuu poikkeukseen, ja tulos on:

”Henkilön nimi ei voi alkaa pienillä kirjaimilla!”

Tällä kertaa heitetty ja kiinni jäänyt tyyppi on char.

Useampi kuin yksi saalislohko yhdelle kokeilulohkolle:

Yhtä yrityslohkoa voi olla useampi kuin yksi salauslohko. Kuvittele tilanne, jossa syötteenä voi olla mikä tahansa näppäimistön merkistä, mutta ei numero eikä aakkoset. Tällöin on oltava kaksi salauslohkoa: yksi kokonaisluvulle tarkistamaan numero ja toinen merkille tarkistamaan aakkoset. Seuraava koodi kuvaa tätä:

#sisältää
käyttämällä nimitilaa vakio;
char input = '*';
int main ()

yrittää

jos (isdigit (input))
heittää 10;
jos (isalpha (syöttö))
heittää 'z';

saalis (int)

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

saalis (hiili)

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

paluu 0;

Ei lähtöä. Jos syötetyn arvon arvo on luku, e.g., '1', tuotos olisi ollut:

"Numeron syöttö on kielletty!"

Jos syötteen arvo olisi aakkoset, e.g., 'a', tuotos olisi ollut:

"Merkkien syöttö on kielletty!"

Huomaa, että kahden salauslohkon parametriluettelossa ei ole tunniste-nimeä. Huomaa myös, että kahden saalislohkon määritelmässä annettuja argumentteja ei ole varmistettu, ovatko niiden arvot tarkat vai eivät.

Saalille on tärkeää tyyppi; saaliin on vastattava heitetyn operandin tyyppiä. Heitetyn argumentin (operandin) tiettyä arvoa voidaan käyttää tarvittaessa lisätarkistukseen.

Useampi kuin yksi käsittelijä samalle tyypille

On mahdollista saada kaksi samaa tyyppiä käsittelijää. Kun poikkeus heitetään, hallinta siirretään lähimpään käsittelijään, jolla on vastaava tyyppi. Seuraava ohjelma kuvaa tätä:

#sisältää
käyttämällä nimitilaa vakio;
char-syöttö = '1';
int main ()

yrittää

jos (isdigit (input))
heittää 10;

saalis (int)

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

saalis (int)

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

paluu 0;

Tuotos on:

"Numeron syöttö on kielletty!"

Sisäkkäiset try / catch-lohkot:

try / catch-lohkot voidaan sijoittaa. Yllä oleva ohjelma ei-aakkosnumeeristen merkkien syöttämistä varten näppäimistöltä toistetaan tässä, mutta aakkosellisen virhekoodin ollessa sisäkkäin:

#sisältää
käyttämällä nimitilaa vakio;
char-syöttö = '*';
int main ()

yrittää

jos (isdigit (input))
heittää 10;
yrittää

jos (isalpha (syöttö))
heittää 'z';

saalis (hiili)

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


saalis (int)

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

paluu 0;

Virhe-aakkosellinen try / catch-block on sisäkkäin numerokoodin try-blockissa. Tämän ohjelman toiminta ja edellinen toiminto, josta se on kopioitu, ovat samat.

noexcept-specifier

Harkitse seuraavaa toimintoa:

void fn (const char * str) ei

jos (islower (str [0]))
heittää 'l';

Huomaa määrittelijä 'noexcept' heti toimintoparametriluettelon oikean sulun jälkeen. Tämä tarkoittaa, että toiminto ei saisi aiheuttaa poikkeusta. Jos toiminto antaa poikkeuksen, kuten tässä tapauksessa, se kääntyy varoitusviestillä, mutta ei toimi. Yritä suorittaa ohjelma kutsuu erikoistoiminto std :: terminate (), jonka pitäisi pysäyttää ohjelma sulavasti sen sijaan, että se vain kaataa kirjaimellisesti.

Noexcept-määrittelijä on eri muodoissa. Nämä ovat seuraavat:

kirjoita func () noexcept; : ei salli heittolauseketta
kirjoita func () noexcept (true); : sallii heittolausekkeen
kirjoita func () heittää (); : ei salli heittolauseketta
kirjoita func () noexcept (false); : sallii heittolausekkeen, joka on valinnainen
kirjoita func (); : sallii heittolausekkeen, joka on valinnainen

sulkeissa oleva tosi tai epätosi voidaan korvata lausekkeella, joka johtaa tosi tai väärä.

Special std :: terminate () -toiminto:

Jos poikkeusta ei voida käsitellä, se on heitettävä uudelleen. Tässä tapauksessa heitetyllä lausekkeella voi olla operandi tai ei. Erikoistoiminto std :: terminate () kutsutaan ajon aikana, jonka pitäisi pysäyttää ohjelma sulavasti sen sijaan, että se vain sallisi kaatua.

Kirjoita, käännä ja suorita seuraava ohjelma:

#sisältää
käyttämällä nimitilaa vakio;
char-syöttö = '1';
int main ()

yrittää

jos (isdigit (input))
heittää 10;

saalis (int)

heittää;

paluu 0;

Onnistuneen kääntämisen jälkeen ohjelma lopetettiin suorittamatta ja kirjoittajan tietokoneelta tuleva virheilmoitus on:

"Lopettaa soitettu heitettyä instanssin

Keskeytetty (ydin polkumyynnillä) ”

Päätelmä:

C ++: n poikkeustoiminto estää koodisegmentin suorittamisen jonkinlaisen syötteen perusteella. Ohjelma jatkuu tarvittaessa. Poikkeusrakenne (virheiden ehkäisy) koostuu try-blockista ja catch-blockista. Kokeilulohkolla on kiinnostava koodisegmentti, joka voidaan ohittaa, riippuen joistakin syöttötiloista. Try-blockilla on heittolauseke, joka heittää operandin. Tätä operandia kutsutaan myös poikkeukseksi. Jos operandityyppi ja saalislohkon parametrin tyyppi ovat samat, poikkeus on kiinni (käsitelty). Jos poikkeusta ei saada kiinni, ohjelma lopetetaan, mutta on silti turvallinen, koska väärää tulosta antavaa koodisegmenttiä ei ole suoritettu. Tyypillinen poikkeusten käsittely tarkoittaa koodisegmentin ohittamista ja virheilmoituksen lähettämistä käyttäjälle. Koodisegmentti suoritetaan normaalille tulolle, mutta ohitetaan väärille tuloille.

5 parasta arcade-peliä Linuxille
Nykyään tietokoneet ovat vakavia koneita, joita käytetään pelaamiseen. Jos et pääse uusiin korkeisiin pisteisiin, tiedät mitä tarkoitan. Tässä viestis...
Battle For Wesnoth 1.13.6 Development Released
Battle For Wesnoth 1.13.6 released last month, is the sixth development release in the 1.13.x series and it delivers a number of improvements, most no...
League of Legendsin asentaminen Ubuntu 14 een.04
Jos olet League of Legendsin fani, tämä on sinulle mahdollisuus testata League of Legendsia. Huomaa, että PlayOnLinux tukee LOLia, jos olet linux-käyt...