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.

Fix error 0x8007042c for Windows Update or Firewall
If you're encountering the error code 0x8007042c when trying to install certain Windows Updates or after a failed upgrade to Windows 10 from an older ...
Kuinka toistaa karttaa C ++ ssa
Tässä pikaoppaassa näemme kuinka iteroida kartalla C: ssä++. On useita tapoja toistaa karttaa C: ssä++. C ++: n uudemmissa versioissa on edistyneempiä...
C ++ - virtuaalitoiminto
Tässä artikkelissa aiomme keskustella virtuaalitoiminnosta C ++ - ohjelmointikielellä. Virtuaalista toimintoa käytetään C ++: ssa ajonaikaisen / dynaa...