Tratarea excepțiilor

Curs de manipulare 14. Excepție

Atunci când programul este construit din module separate, și, mai ales, atunci când aceste module sunt dezvoltate în mod independent, biblioteci, eroare de manipulare ar trebui să fie împărțită în două părți:
  1. generarea de informații cu privire la originea situației de eroare, care nu pot fi rezolvate la nivel local;
  2. eroare de manipulare se găsește în alte locuri.

Ideea fundamentală este aceea că funcția de detectare a problemei, dar nu știe cum să o rezolve, aruncă o excepție, în speranța că aceasta a cauzat (direct sau indirect) caracteristică poate rezolva problema. Funcție care vrea să rezolve problemele de acest tip, poate indica faptul că interceptează astfel de excepții.

Acest stil de eroare de manipulare este de preferat pentru multe dintre tehnicile tradiționale. Luați în considerare alternativa. Dacă vă confruntați cu o problemă care nu poate fi rezolvată la nivel local, funcția poate fi:
  1. opri de executare;
  2. a reveni valoare care indică „eroare“;
  3. returnează o valoare validă și se lasă programul într-o stare anormală.

Opțiunea 1 - „stop de funcționare“ - aceasta este ceea ce se întâmplă în mod implicit atunci când nu prind excepții. Pentru cele mai multe erori, noi trebuie să vină cu ceva mai bun. Biblioteca completează cu siguranță, executarea nu poate fi utilizat în program, prima cerință pentru că - fiabilitate.

Opțiunea 2 - „valoarea de întoarcere, de semnalizare eroare“ - nu este întotdeauna posibil, pentru că de multe ori nu există nici un nivel acceptabil. Chiar și în acele cazuri în care această abordare este aplicabilă, este de multe ori incomod, pentru că rezultatul fiecărui apel trebuie să fie verificate pentru o valoare de eroare. Acest lucru poate crește foarte mult dimensiunea programului.

Opțiunea 3 - „pentru a returna o valoare validă și se lasă programul într-o stare anormală“ - are dezavantajul că apelantul nu poate observa că programul este într-o stare anormală.

Mecanismul de manipulare excepție oferă o alternativă la metodele tradiționale în cazurile în care acestea nu sunt suficiente, nu elegant și predispus la erori. Acesta oferă o modalitate de a separa în mod explicit codul de eroare de manipulare din codul „obișnuit“, făcând astfel programul mai ușor de citit și mai potrivite pentru o varietate de instrumente. mecanism de manipulare excepție oferă un mod mai regulat de erori de manipulare, ceea ce face mai ușor ca rezultat al interacțiunii dintre fragmentele de cod scrise individuale.

Trebuie înțeles faptul că manipularea de eroare rămâne o provocare și că mecanismul de manipulare excepție - în ciuda bóformalizare mai mare decât metodele alternative - relativ mai puțin în comparație cu resursele lingvistice structurate care asigură managementul de execuție locală. Mecanismul C ++ manipulare excepție permite prelucrarea eroare programator înseamnă, în locul unde acestea sunt prelucrate în mod natural cel mai mult la structura sistemului. Excepții fac complexitatea erorilor de manipulare mai vizibile. Cu toate acestea, excepțiile nu sunt cauza acestei complexitate.

excepție mecanism de manipulare poate fi considerată ca o alternativă la mecanismul de întoarcere din funcția. Prin urmare, este legitim de a utiliza excepțiile, care nu au nici o legătură cu erori. Cu toate acestea, scopul principal de manipulare excepție este eroare de manipulare și durabilitate atunci când apar erori.

Procesarea Excepție furnizează o metodă pentru transmiterea de informații de control și punctul nedefinită, în cazul în care acesta a fost exprimat dorința de a se ocupe de acest tip de situație. Situațiile de orice tip poate fi excitat (arunca) și intercepta (captură), iar funcția poate fi transferată într-o multitudine de situații care pot fi excitat în ea.

Reacția va fi declanșată numai în cazul execuției unei expresii excitat în interiorul unității cu comanda sau funcția numită din acest bloc.

bloc sintaxa pentru a controla:
încerca<список реакций>

Expresia de excitație are următoarea sintaxă:
arunca<выражение> ;

La situația de excitație (adică performant operator de aruncare) se trece la reacția. Tipul de operator de aruncare operanzi determină care reacțiile pot intercepta această situație.

În cazul în care, printre reacțiile la unitatea de control a fost găsită corespunzătoare lista de reacție continuă reacție adecvate în unitatea de control, care acoperă blocul cu control.

În cazul în care programul nu a găsit o reacție adecvată a cauzat înceta funcția (). înceta () funcția apelează funcția specificată prin accesarea în final funcția set_terminate (). În mod implicit, funcția numită din funcția încetează (). există abort (). Funcția, funcția încetează (). trebuie să completeze programul.

O excepție este un obiect dintr-o anumită clasă. Este o reprezentare a cazului excepțional. Codul detectat eroarea, acesta generează un obiect instrucțiuni de aruncare. Fragmentul de cod exprimă dorința sa de a manipula excepția folosind o declarație de captură. Rezultatul unei excepții este declarația arunca derularea stivei, atâta timp cât nici o captură corespunzătoare în funcția va fi găsit, care este cauzată în mod direct sau indirect, funcția, o excepție este aruncată.

Simplul fapt de generare de excludere trimite informații despre eroare și tipul acesteia. În plus, excepția poate conține informații suplimentare. Scopul fundamental al tehnicii de manipulare excepție este de a transmite informații pentru a recupera de la evenimente de probleme și pentru acest mod fiabil și convenabil.

Handler va fi invocat, în cazul în care:
  1. N același tip ca și cea a E;
  2. H este unic disponibil clasa de baza publica pentru E;
  3. H și E sunt indicii, și 1 sau 2 se realizează pentru tipurile la care se referă;
  4. H este o referință, și 1 sau 2 se realizează pentru tipul referite h.

Adesea excepții în mod natural în familii. Din aceasta rezultă, că moștenirea poate fi de ajutor pentru a structura excepțiilor și pentru a ajuta cu tratamentul lor. De exemplu, excepții pentru biblioteca matematică pot fi organizate după cum urmează.

clasa mathErr <.>; clasa Overflow. mathErr publice <.>; clasa fluxului inferior. mathErr publice <.>; clasa ZeroDivision. mathErr publice <.>;

// // preaplin de preaplin din partea de sus de jos // Divizia de 0

Acest lucru ne permite să se ocupe de excluderea din orice clasă derivată din MathErr. nu pese de ce a avut loc exact excepție.

// mâner excepție Overflow și toate derivate din ea Excepție // Manipulați orice excepții MathErr. non Overflow

Organizarea excepțiilor sub formă de ierarhii pot fi importante pentru fiabilitatea codului. Odată cu introducerea unei noi excepții la biblioteca matematică fiecare bucată de cod care încearcă să se ocupe de toate excepțiile de matematica, ar fi supuse modificării. Este nevoie de o mulțime de muncă și este, în general imposibilă.

Prinderea manipulant excepție poate decide că nu se poate ocupa pe deplin eroarea. În acest caz, handler face atunci ce poate produce din nou o excepție.

// Poate un mâner complet eroarea? // face ceea ce este posibil // Re-generare de excepții

re generatoare de fapt este notat în aruncarea absență operandului. În cazul în care încercarea de re-generare fără excepție, funcția încetează () se numește.

excepție generată în mod repetat, este o sursă de excepție, și anume chiar dacă handlerul este de lucru cu obiectul clasei de bază. Unitatea de acoperire primește inițial obiectul generat al unei clase derivate.

Deoarece excepții derivate clase pot fi interceptate clasa de baza manipulant excepție, ordine, la care instrucțiunile înregistrate stivuitoare pentru a încerca. Este de mare importanță. Manipulatorii sunt verificate în ordinea în care au fost înregistrate.

încerca de captură (std :: ios_base :: eșec) de captură (std :: excepție) captura (.)

// Eroare de manipulare în I / O flux // Excepție de manipulare a biblioteca standard // Manevrați toate celelalte excepții

Excepții oferă o modalitate de a rezolva problema modului de a raporta o eroare de proiectant. Deoarece constructorul nu returnează o valoare care apelantul poate verifica, tradiționale (de exemplu, fără utilizarea de manipulare excepție) alternative sunt după cum urmează.
  1. Întoarcere obiectul în stare „greșit“ și se bazează pe faptul că utilizatorul a verifica starea lui.
  2. Atribui o valoare unei variabile non-locale pentru a indica crearea fără succes a unui obiect, și se bazează pe faptul că utilizatorul va verifica.
  3. Nu efectuați nici o inițializare în constructor, și se bazează pe faptul că utilizatorul va apela funcția de inițializare (care încă mai trebuie să scrie!) Înainte de prima utilizare a obiectului.
  4. Marchează ca obiect neinițializate și primul apel la o clasă de funcții membru pentru a efectua acest obiect initializare (această funcție poate returna un mesaj de eroare în cazul unei initializare fără succes, dar utilizatorul trebuie să verifice din nou valoarea returnată a funcției).

Excepțiile permit să transmită informații cu privire la inițializarea fara succes a designerului. De exemplu, clasa Vector ar putea fi protejate de cerere prea multă memorie, generând o excepție corespunzătoare. clasa Vector <. public. class Size <.>; Vector (int n = 0); .>; Vector :: Vector (int n) MAX_SIZE) Aruncare Dimensiune (); .>

Codul creează un vector, poate prinde acum eroare Vector :: Dimensiune și să încerce să facă ceva semnificativ.

În cazul în care este de așteptat o excepție și prins într-un mod care nu afectează în mod negativ comportamentul programului, motiv pentru care poate fi considerată o greșeală? Mecanisme de manipulare excepție poate fi văzută ca o altă structură de control.

// Obține funcția generează o excepție gol. în cazul în care coada este goală

Excepție de manipulare este un mecanism mai puțin structurat decât structurile locale de control la aceeași manipulare excepție este adesea mai puțin eficace, în cazul în care o excepție este, de fapt generată. Prin urmare, excluderea ar trebui utilizat în cazurile în care structurile de control tradiționale sunt soluții inelegant, sau nu pot folosi.

Utilizarea excesivă a excepțiilor duce la un cod de neînțeles. În mod normal, ar trebui să adere la în termeni de „manipulare eroare de manipulare excepție.“ Cu această abordare, codul este pe înțelesul este împărțit în două părți: un cod obișnuit și codul de eroare de manipulare.

Se presupune că o funcție declarată, fără excepție, caietul de sarcini poate arunca orice excepție.
int g (int n);

O funcție care generează nicio excepție poate fi declarată cu o listă goală de specificații excepții.
int h (int n) aruncare ();

Noi modifica clasa stivă (de la Lecture 11), astfel încât, atunci când o depășire de stivă și încercarea de a lua un element dintr-o stivă de gol pentru a genera excepția corespunzătoare.
#include Clasa de stivă; clasa StackEmpty Stiva * GetPtr () >; clasa StackFull Stiva * GetPtr () int GetValue () >; clasa de stivă ; int stivă [SIZE]; int * javră; publice. Stivă ()

articole similare