Syntaksivirheet
Väärin kirjoitettu lauseke, lause tai rakenne on syntaksivirhe.
Harkitse seuraavia kahta lausetta:
int arr [] = 1, 2, 3; //oikeaint 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) eijos (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 heittolausekettakirjoita 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.