C ++

Izņēmumu apstrāde C ++

Izņēmumu apstrāde C ++
Pastāv trīs programmatūras kļūdu veidi. Tās ir sintakses kļūdas, loģikas kļūdas un izpildlaika kļūdas.

Sintakses kļūdas

Nepareizi ierakstīta izteiksme, priekšraksts vai konstrukcija ir sintakses kļūda.

Apsveriet šādus divus apgalvojumus:

int arr [] = 1, 2, 3; // izlabot
int arr = 1, 2, 3; // sintakses kļūda, trūkst []

Tās ir tā paša masīva definīcijas. Pirmais ir pareizs. Otra trūkst [], un tā ir sintakses kļūda. Programmu ar sintakses kļūdu neizdodas apkopot. Kompilācija neizdodas ar kļūdas ziņojumu, kas norāda sintakses kļūdu. Labi ir tas, ka sintakses kļūdu vienmēr var novērst, ja programmētājs zina, ko viņš dara.

Loģikas kļūda

Loģikas kļūda ir kļūda, ko pieļāvis programmētājs, kad tiek veikta nepareiza loģiskā kodēšana. Tas var būt programmētāja nezināšanas un programmēšanas valodas iezīmju rezultāts vai pārpratums par to, kas programmai jādara.

Šajā situācijā programma tiek veiksmīgi sastādīta. Programma darbojas labi, taču tā rada nepareizus rezultātus. Šāda kļūda var rasties tāpēc, ka cilpa tiek atkārtota 5 reizes, kad tiek atkārtota 10 reizes. Var gadīties arī, ka neapzināti tiek izveidota cilpa, kas atkārtojas bezgalīgi. Vienīgais veids, kā novērst šāda veida kļūdas, ir rūpīgi veikt programmēšanu un rūpīgi pārbaudīt programmu, pirms to nododat klientam.

Izpildlaika kļūdas

Nepareiza vai ārkārtas ievade izraisa izpildlaika kļūdas. Šajā gadījumā programma tika veiksmīgi sastādīta un labi darbojas daudzās situācijās. Dažās situācijās programma avarē (un apstājas).

Iedomājieties, ka programmas koda segmentā 8 ir jāsadala ar vairākiem saucējiem. Tātad, ja skaitītājs 8 tiek dalīts ar saucēju 4, atbilde (koeficients) būtu 2. Tomēr, ja lietotājs ievada 0 kā saucēju, programma avarētu. Matemātikā nav atļauta dalīšana ar 0, kā arī skaitļošana nav atļauta. Programmēšanā būtu jānovērš dalīšana ar nulli. Izņēmumu apstrāde apstrādā izpildlaika kļūdas, piemēram, dalīšana ar nulli. Šī programma parāda, kā rīkoties ar dalīšanas pa nulli problēmu, neizmantojot izņēmuma funkciju C ++:

# iekļaut
izmantojot nosaukumvietu std;
int main ()

int skaitītājs = 8;
int saucējs = 2;
ja (saucējs != 0)

int rezultāts = skaitītājs / saucējs;
cout << result << '\n';

cits

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

atgriešanās 0;

Rezultāts ir 4. Ja saucējs būtu 0, rezultāts būtu bijis:

“Dalīšana ar nulli nav atļauta!”

Šeit galvenais kods ir if-else konstrukcija. Ja saucējs nav 0, dalīšana notiks; ja tas ir 0, dalīšana nenotiks. Lietotājam tiks nosūtīts kļūdas ziņojums, un programma turpina darboties bez avārijas. Runtime kļūdas parasti apstrādā, izvairoties no koda segmenta izpildes un nosūtot lietotājam kļūdas ziņojumu.

Izņēmuma funkcija C ++ izmanto mēģinājumu bloķēt bloku if-bloku un nozvejas bloku cits blokam, lai apstrādātu kļūdu, tieši šādi:

# iekļaut
izmantojot nosaukumvietu std;
int main ()

int skaitītājs = 8;
int saucējs = 2;
mēģiniet

ja (saucējs != 0)

int rezultāts = skaitītājs / saucējs;
cout << result << '\n';

cits

iemest 0;


nozveja (starp kļūdām)

ja (kļūda == 0)
cout << "Division by zero is not permitted!" << '\n';

atgriešanās 0;

Ņemiet vērā, ka mēģinājuma galvenē nav argumenta. Ņemiet vērā arī to, ka uztveršanas blokam, kas ir kā funkcijas definīcija, ir parametrs. Parametra tipam jābūt tādam pašam kā mest izteiksmes operandam (argumentam). Metiena izteiksme ir mēģinājumu blokā. Tas izvirza argumentu par programmētāja izvēli, kas saistīts ar kļūdu, un uztveršanas bloks to uztver. Tādā veidā kods izmēģinājuma blokā netiek izpildīts. Pēc tam bloķēšanas blokā tiek parādīts kļūdas ziņojums.

Šajā rakstā ir izskaidrota izņēmumu apstrāde C++. Pamatzināšanas C ++ valodā ir priekšnoteikums, lai lasītājs saprastu šo rakstu.

Raksta saturs:

  • Funkcija Izņēmuma mešana
  • Vienam mēģinājumam bloķēt vairāk nekā vienu ķeršanas bloku
  • Ligzdots izmēģināt / noķert blokus
  • noexcept-specifier
  • Īpašā std :: terminate () funkcija
  • Secinājums

Funkcija, kas izsniedz izņēmumu:

Funkcija var izraisīt arī izņēmumu, tāpat kā mēģinājumu bloķēšana. Mešana notiek funkcijas definīcijas ietvaros. To ilustrē šāda programma:

# iekļaut
izmantojot nosaukumvietu std;
void fn (const char * str)

ja (islower (str [0]))
mest 'l';

int main ()

mēģiniet

fn ("kalējs");

nozveja (char ch)

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

atgriešanās 0;

Ievērojiet, ka šoreiz mēģinājuma blokam ir tikai funkcijas izsaukums. Tā ir izsauktā funkcija, kurai ir metiena darbība. Nozvejas bloks uztver izņēmumu, un rezultāts ir:

“Personas vārds nevar sākties ar mazajiem burtiem!”

Šoreiz izmestais un noķertais tips ir char.

Vairāk nekā viens ķeršanas bloks vienam izmēģinājuma blokam:

Vienam mēģinājumam var būt vairāki bloķēšanas bloki. Iedomājieties situāciju, kad ievade var būt jebkura no tastatūras rakstzīmēm, bet ne cipars un ne alfabēts. Šajā gadījumā jābūt diviem uztveršanas blokiem: viens skaitlim, lai pārbaudītu ciparu, un otrs, lai pārbaudītu alfabētu. Šis kods ilustrē to:

# iekļaut
izmantojot nosaukumvietu std;
char ievade = '*';
int main ()

mēģiniet

ja (isdigit (ievade))
iemest 10;
ja (isalpha (ievade))
mest 'z';

nozveja (int)

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

nozveja (char)

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

atgriešanās 0;

Nav izejas. Ja ievades vērtība būtu cipars, e.g., “1”, rezultāts būtu bijis:

"Ciparu ievade ir aizliegta!"

Ja ievades vērtība būtu alfabēts, e.g., “a”, produkcija būtu bijusi:

"Rakstzīmju ievade ir aizliegta!"

Ņemiet vērā, ka divu uztveršanas bloku parametru sarakstā nav identifikatora nosaukuma. Ņemiet vērā arī to, ka divu nozvejas bloku definīcijā konkrētie izvirzītie argumenti nav pārbaudīti, vai to vērtības ir precīzas vai nav.

Nozvejai ir svarīgs veids; nozvejai jāatbilst izmestā operanda veidam. Konkrēto izmestā argumenta (operanda) vērtību var izmantot turpmākai pārbaudei, ja nepieciešams.

Vairāk nekā viens apstrādātājs vienam un tam pašam tipam

Ir iespējami divi viena tipa apstrādātāji. Kad tiek izmests izņēmums, vadība tiek pārsūtīta uz tuvāko apstrādātāju ar atbilstošu tipu. To ilustrē šāda programma:

# iekļaut
izmantojot nosaukumvietu std;
char ievade = '1';
int main ()

mēģiniet

ja (isdigit (ievade))
iemest 10;

nozveja (int)

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

nozveja (int)

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

atgriešanās 0;

Rezultāts ir:

"Ciparu ievade ir aizliegta!"

Ligzdoti mēģinājumu / ķeršanas bloki:

try / catch bloki var būt ligzdoti. Šeit tiek atkārtota iepriekš minētā programma bez burtciparu rakstzīmju ievadīšanai no tastatūras, bet ar alfabēta kļūdas kodu ir ievietots:

# iekļaut
izmantojot nosaukumvietu std;
char ievade = '*';
int main ()

mēģiniet

ja (isdigit (ievade))
iemest 10;
mēģiniet

ja (isalpha (ievade))
mest 'z';

nozveja (char)

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


nozveja (int)

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

atgriešanās 0;

Kļūdu alfabētiskais mēģinājums / uztveršanas bloks ir ievietots ciparu koda mēģinājuma blokā. Šīs programmas darbība un iepriekšējā darbība, no kuras tā tiek kopēta, ir vienādas.

noexcept-specifier

Apsveriet šādu funkciju:

void fn (const char * str) noexcept

ja (islower (str [0]))
mest 'l';

Ievērojiet parametru “noexcept” tieši pēc funkciju parametru saraksta labās iekavas. Tas nozīmē, ka funkcijai nevajadzētu būt izņēmumam. Ja funkcija rada izņēmumu, kā tas ir šajā gadījumā, tā tiks apkopota ar brīdinājuma ziņojumu, bet nedarbosies. Mēģinājums palaist programmu izsauks īpašo funkciju std :: terminate (), kurai programma ir jāaptur graciozi, nevis tikai jāļauj burtiski avarēt.

Noexcept specifikators ir dažādās formās. Tie ir šādi:

ierakstiet func () noexcept; : nepieļauj metiena izteiksmi
ierakstiet func () noexcept (true); : pieļauj metiena izteiksmi
tips func () mest (); : nepieļauj metiena izteiksmi
ierakstiet func () noexcept (false); : ļauj mest izteiksmi, kas nav obligāta
ierakstiet func (); : ļauj mest izteiksmi, kas nav obligāta

patieso vai nepatieso iekavās var aizstāt ar izteiksmi, kuras rezultāts ir patiess vai nepatiess.

Funkcija Special std :: terminate ():

Ja izņēmumu nevar apstrādāt, tas ir jāpārmet. Šajā gadījumā izmestajai izteiksmei var būt operands, bet var arī nebūt. Izpildes laikā tiks izsaukta īpašā funkcija std :: terminate (), kurai programma ir jāaptur graciozi, nevis tikai jāļauj tai burtiski avarēt.

Ierakstiet, apkopojiet un palaidiet šo programmu:

# iekļaut
izmantojot nosaukumvietu std;
char ievade = '1';
int main ()

mēģiniet

ja (isdigit (ievade))
iemest 10;

nozveja (int)

mest;

atgriešanās 0;

Pēc veiksmīgas kompilēšanas programma tika pārtraukta, nedarbojoties, un kļūdas ziņojums no autora datora ir šāds:

“Pārtraukt zvanu pēc“ int ”instances iemetiena

Pārtraukts (kodols izgāzts) ”

Secinājums:

C ++ izņēmuma funkcija neļauj koda segmentam izpildīt, pamatojoties uz kāda veida ievadi. Programmu turpina izpildīt pēc nepieciešamības. Izņēmuma (kļūdu novēršanas) konstrukcija sastāv no try-block un catch-block. Mēģinājuma blokam ir interesējošais koda segments, kuru var apiet, atkarībā no kāda ievades nosacījuma. Mēģinājuma blokam ir metiena izteiksme, kas iemet operandu. Šo operandu sauc arī par izņēmumu. Ja operanda tips un ķeršanas bloka parametra tips ir vienādi, tad izņēmums tiek noķerts (apstrādāts). Ja izņēmums nav noķerts, programma tiks pārtraukta, taču joprojām būs drošībā, jo nav izpildīts koda segments, kas bija jāizpilda, lai sniegtu nepareizu rezultātu. Tipiska izņēmumu apstrāde nozīmē koda segmenta apiešanu un kļūdas ziņojuma nosūtīšanu lietotājam. Kodu segments tiek izpildīts normālai ievadei, bet tiek apiets nepareizu ievades gadījumā.

Kā instalēt un spēlēt Doom uz Linux
Ievads liktenī Doom sērija radās 90. gados pēc sākotnējā Doom izlaišanas. Tas bija tūlītējs hīts, un kopš tā laika spēļu sērija ir saņēmusi daudzas ba...
Vulkan Linux lietotājiem
Ar katru jauno grafisko karšu paaudzi mēs redzam, kā spēļu izstrādātāji pārspēj grafiskās uzticamības robežas un tuvojas fotoreālismam. Neskatoties uz...
OpenTTD vs Simutrans
Transporta simulācijas izveide var būt jautra, relaksējoša un ārkārtīgi vilinoša. Tāpēc jums jāpārliecinās, ka izmēģināt pēc iespējas vairāk spēļu, la...