Sintaksne napake
Napačno vtipkan izraz, stavek ali konstrukcija je sintaksna napaka.
Upoštevajte naslednji dve trditvi:
int arr [] = 1, 2, 3; // pravilnoint arr = 1, 2, 3; // sintaksna napaka, manjka []
So definicije istega polja. Prvi je pravilen. Drugi manjka [], in to je sintaksna napaka. Programa s sintaksno napako ni uspelo prevesti. Prevajanje ne uspe s sporočilom o napaki, ki označuje sintaksno napako. Dobra stvar je, da je sintaksno napako vedno mogoče odpraviti, če programer ve, kaj počne.
Logična napaka
Logična napaka je napaka, ki jo stori programer, ko pride do napačnega logičnega kodiranja. To je lahko posledica nepoznavanja programerja glede funkcij programskega jezika ali nerazumevanja, kaj naj program naredi.
V tem primeru je program uspešno sestavljen. Program deluje dobro, vendar daje napačne rezultate. Takšna napaka je lahko posledica petkratne ponovitve zanke, če je ponovljena 10-krat. Mogoče je tudi, da je zanka nezavedno narejena, da se neskončno ponavlja. Edini način za odpravo tovrstne napake je skrbno programiranje in temeljit preizkus programa, preden ga predate stranki.
Napake med izvajanjem
Napačni ali izjemni vnosi povzročajo napake med izvajanjem. V tem primeru je bil program uspešno sestavljen in v mnogih situacijah dobro deluje. V nekaterih primerih se program zruši (in ustavi).
Predstavljajte si, da je treba v segmentu programske kode 8 deliti s številom imenovalcev. Torej, če števec 8 delimo z imenovalcem 4, bi bil odgovor (količnik) 2. Če uporabnik kot imenovalec vnese 0, se program zruši. Delitev z 0 v matematiki ni dovoljena in tudi pri računalništvu ni dovoljena. Pri programiranju je treba preprečiti deljenje z ničlo. Obravnavanje izjem obravnava napake med izvajanjem, na primer delitev z ničlo. Naslednji program prikazuje, kako rešiti težavo z delitvijo po nič, ne da bi v C ++ uporabili funkcijo izjeme:
#includeuporaba imenskega prostora std;
int main ()
int števec = 8;
imenovalec int = 2;
če (imenovalec != 0)
int rezultat = števec / imenovalec;
cout << result << '\n';
drugače
cout << "Division by zero is not permitted!" << '\n';
vrnitev 0;
Izhod je 4. Če bi bil imenovalec 0, bi bil rezultat:
»Delitev z ničlo ni dovoljena!"
Glavna koda tukaj je konstrukt if-else. Če imenovalec ni 0, se izvede delitev; če je 0, delitev ne bo izvedena. Uporabniku bo poslano sporočilo o napaki in program bo še naprej deloval brez zrušitve. Napake med izvajanjem se običajno obravnavajo tako, da se izognemo izvedbi segmenta kode in uporabniku pošljemo sporočilo o napaki.
Funkcija izjeme v jeziku C ++ za poskus napake uporablja poskusni blok za blok if in blok catch za blok else, tako kot sledi:
#includeuporaba imenskega prostora std;
int main ()
int števec = 8;
imenovalec int = 2;
poskusite
če (imenovalec != 0)
int rezultat = števec / imenovalec;
cout << result << '\n';
drugače
met 0;
ulov (int err)
če (napaka == 0)
cout << "Division by zero is not permitted!" << '\n';
vrnitev 0;
Upoštevajte, da poskusna glava nima argumenta. Upoštevajte tudi, da ima catch-block, ki je kot definicija funkcije, parameter. Tip parametra mora biti enak operandu (argumentu) meta-izraza. Izraz meta je v poskusnem bloku. Vrne argument po izbiri programerja, ki je povezan z napako, in catch-block ga ujame. Na ta način se koda v poskusnem bloku ne izvrši. Nato blok catch prikaže sporočilo o napaki.
Ta članek pojasnjuje ravnanje z izjemami v jeziku C++. Osnovno znanje jezika C ++ je predpogoj, da bralec razume ta članek.
Vsebina članka:
- Funkcija metanja izjeme
- Več blokov ulova za en poskusni blok
- Vgnezdeni bloki za poskus / ulov
- noexcept-specifier
- Posebna funkcija std :: terminate ()
- Zaključek
Funkcija metanja izjeme:
Funkcija lahko vrže tudi izjemo, tako kot to počne poskusni blok. Metanje poteka znotraj definicije funkcije. Naslednji program to ponazarja:
#includeuporaba imenskega prostora std;
void fn (const char * str)
if (islower (str [0]))
vrzi 'l';
int main ()
poskusite
fn ("kovač");
ulov (char ch)
če (ch == 'l')
cout << "Person's name cannot begin in lowercase!" << '\n';
vrnitev 0;
Upoštevajte, da ima blok try tokrat samo funkcijski klic. Klicana funkcija ima operacijo meta. Blok catch ujame izjemo in izhod je:
»Ime osebe se ne sme začeti z malimi črkami!"
Tokrat je vržen in ujet tip char.
Več blokov za en poskusni blok:
Za en poskusni blok je lahko več kot en blok ulova. Predstavljajte si situacijo, ko je vnos lahko kateri koli znak tipkovnice, ne pa tudi številka in ne abeceda. V tem primeru morata biti dva bloka ulova: eden za celo število za preverjanje števke in drugi za znak za preverjanje abecede. Naslednja koda to ponazarja:
#includeuporaba imenskega prostora std;
char input = '*';
int main ()
poskusite
if (isdigit (input))
met 10;
če (isalpha (input))
vrzi 'z';
ulov (int)
cout << "Digit input is forbidden!" << '\n';
ulov (char)
cout << "Character input is forbidden!" << '\n';
vrnitev 0;
Ni izhoda. Če je bila vrednost vnosa števčna, npr.g., '1', bi bil rezultat:
"Vnos številk je prepovedan!"
Če bi bila vrednost vnosa abeceda, npr.g., 'a', bi bil rezultat:
"Vnos znakov je prepovedan!"
Upoštevajte, da na seznamu parametrov obeh ulovnih blokov ni imena identifikatorja. Upoštevajte tudi, da v definiciji obeh ulovnih blokov določeni vrženi argumenti niso bili preverjeni, ali so njihove vrednosti natančne.
Za ulov je pomembna vrsta; ulov mora ustrezati vrsti vrženega operanda. Po potrebi določeno vrednost vrženega argumenta (operanda) lahko uporabite za nadaljnje preverjanje.
Več kot en vodnik za isti tip
Možno je imeti dva vodnika iste vrste. Ko se vrne izjema, se nadzor prenese na najbližjega upravljavca z ustreznim tipom. Naslednji program to ponazarja:
#includeuporaba imenskega prostora std;
char input = '1';
int main ()
poskusite
if (isdigit (input))
met 10;
ulov (int)
cout << "Digit input is forbidden!" << '\n';
ulov (int)
cout << "Not allowed at all: digit input!" << '\n';
vrnitev 0;
Rezultat je:
"Vnos številk je prepovedan!"Vgnezdeni bloki / poskusi / ulov:
bloke try / catch lahko ugnezdijo. Tu se ponovi zgornji program za vnos ne-alfanumeričnih znakov s tipkovnice, vendar z ugnezdeno abecedno kodo napake:
#includeuporaba imenskega prostora std;
char input = '*';
int main ()
poskusite
if (isdigit (input))
met 10;
poskusite
če (isalpha (input))
vrzi 'z';
ulov (char)
cout << "Character input is forbidden!" << '\n';
ulov (int)
cout << "Digit input is forbidden!" << '\n';
vrnitev 0;
Abecedni blok napake poskus / ulov je ugnezden v blok poskusov številčne kode. Delovanje tega programa in prejšnje operacije, iz katere je kopiran, je enako.
noexcept-specifier
Upoštevajte naslednjo funkcijo:
void fn (const char * str) razenif (islower (str [0]))
vrzi 'l';
Opazite specifikator 'noexcept' takoj za desno oklepajem seznama funkcijskih parametrov. To pomeni, da funkcija ne sme vrniti izjeme. Če funkcija vrže izjemo, kot v tem primeru, se bo zbrala z opozorilnim sporočilom, vendar se ne bo zagnala. Poskus zagona programa bo poklical posebno funkcijo std :: terminate (), ki bi morala program elegantno ustaviti, namesto da bi mu dovolila dobesedno zrušitev.
Specifikator noexcept je v različnih oblikah. Ti so naslednji:
vnesite func () noexcept; : ne dovoljuje izraza metavnesite func () noexcept (true); : omogoča izraz meta
vnesite funkc () throw (); : ne dovoljuje izraza meta
vnesite func () noexcept (false); : dovoli izraz meta, ki ni obvezen
vnesite funkc (); : dovoljuje izraz meta, ki ni obvezen
true ali false v oklepajih lahko nadomestimo z izrazom, ki povzroči true ali false.
Posebna funkcija std :: terminate ():
Če izjeme ni mogoče obravnavati, jo je treba znova vrniti. V tem primeru ima vrženi izraz operand ali ne. Med izvajanjem bo poklicana posebna funkcija std :: terminate (), ki bi morala program elegantno ustaviti, namesto da bi mu dovolila, da se dobesedno zruši.
Vnesite, prevedite in zaženite naslednji program:
#includeuporaba imenskega prostora std;
char input = '1';
int main ()
poskusite
if (isdigit (input))
met 10;
ulov (int)
metati;
vrnitev 0;
Po uspešni kompilaciji se program zaključi brez zagona in sporočilo o napaki iz avtorjevega računalnika je:
“Terminate, poklican po vrženju primerka 'int'
Prekinitev (jedro odvrženo) "
Zaključek:
Funkcija izjeme v C ++ preprečuje izvajanje segmenta kode na podlagi neke vrste vnosa. Program se po potrebi še naprej izvaja. Konstrukcija izjeme (preprečevanje napak) je sestavljena iz poskusnega bloka in bloka ulova. Poskusni blok ima kodni segment, ki ga zanima, ki ga je mogoče obiti, odvisno od nekaterih pogojev vnosa. Poskusni blok ima izraz za metanje, ki vrže operand. Ta operand se imenuje tudi izjema. Če sta vrsta operanda in tip parametra ulovnega bloka enaka, potem je izjema ujeta (obdelana). Če izjema ne bo ujeta, bo program zaključen, vendar vseeno bodite varni, saj segment kode, ki naj bi se izvedel, da bi dal napačen rezultat, ni bil izveden. Tipično ravnanje z izjemami pomeni zaobideti kodni segment in uporabniku poslati sporočilo o napaki. Segment kode se izvede za običajne vnose, za napačne vnose pa se zaobide.