C ++

Obravnava izjem v C ++

Obravnava izjem v C ++
Obstajajo tri vrste napak v programski opremi. To so sintaksne napake, logične napake in napake med izvajanjem.

Sintaksne napake

Napačno vtipkan izraz, stavek ali konstrukcija je sintaksna napaka.

Upoštevajte naslednji dve trditvi:

int arr [] = 1, 2, 3; // pravilno
int 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:

#include
uporaba 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:

#include
uporaba 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:

#include
uporaba 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:

#include
uporaba 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:

#include
uporaba 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:

#include
uporaba 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) razen

if (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 meta
vnesite 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:

#include
uporaba 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.

S pomočjo gumba X-Mouse Button Control različno prilagodite gumbe miške za različno programsko opremo
Mogoče potrebujete orodje, ki bi lahko spremenilo nadzor miške z vsako aplikacijo, ki jo uporabljate. V tem primeru lahko preizkusite aplikacijo z ime...
Microsoft Sculpt Touch Wireless Mouse Review
Pred kratkim sem prebral o Microsoftov kiparski dotik brezžično miško in se odločil za nakup. Potem ko sem ga nekaj časa uporabljal, sem se odločil, d...
Zaslonska sledilna ploščica in kazalec miške AppyMouse za tablične računalnike Windows
Uporabniki tabličnih računalnikov pogosto zgrešijo miškin kazalec, še posebej kadar običajno uporabljajo prenosne računalnike. Pametni telefoni in tab...