Instrucțiunea de încercare

Operator-încercați-în cele din urmă:
__try compozit-operator

Instrucțiunea "try-final" este o extensie Microsoft pentru C și C ++ și permite aplicațiilor țintă să se asigure că codul de curățare este executat atunci când blocul de cod este întrerupt. Purge include sarcinile, cum ar fi alocarea alocării memoriei, închiderea fișierelor și eliberarea descriptorilor acestora. Instrucțiunea "try-final" este utilă în special pentru subrutinele care verifică erorile din mai multe locuri care pot provoca o revenire prematură din subrutină.







Pentru mai multe informații și un exemplu de cod, consultați instrucțiunea Try-except. Pentru mai multe informații despre manipularea excepțională structurată în general, consultați Manipularea excepțională structurată. Pentru mai multe informații despre tratarea excepțiilor în aplicațiile gestionate, consultați Gestionarea excepțiilor în / clr.

Executarea structurată a excepțiilor este acceptată în Win32 pentru fișierele sursă atât în ​​C, cât și în C ++. Cu toate acestea, nu este proiectat special pentru C ++. Pentru ca codul dvs. să fie mai bine tolerat, este mai bine să utilizați mecanismul de manipulare a excepțiilor C ++. În plus, acest mecanism este mai flexibil, deoarece poate face față excepțiilor de orice tip. În programele C ++, este recomandat să utilizați mecanismul de manipulare a excepțiilor C ++ (încercați, prindeți și aruncați instrucțiuni).

Instrucțiunea compus după clauza __try este o secțiune protejată. Declarația compusă după propoziția __finală este terminatorul de terminare. Acest handler definește un set de operațiuni efectuate la ieșirea din secțiunea protejată, indiferent dacă ieșirea din eliminarea are loc (terminarea anormală) sau ca urmare a controlului suplimentar standard de transmitere (valoarea normală).

Controlul ajunge la operatorul __try în timpul execuției secvențiale normale (controlul transferului mai departe). Dacă controlul este inclus în __try. mânerul corespunzător devine activ. Dacă fluxul de controale ajunge la sfârșitul blocului de încercare, execuția continuă după cum urmează.







Operatorul de ieșire este chemat.

După terminarea procesului de ieșire, execuția continuă după instrucțiunea __finally. Nu contează cât de partiție securizată este finalizată (de exemplu, ieșirea operatorului Goto din corpul protejat sau returnarea operatorului), handler este executat înainte de finalizare (înainte) controlează fluxul de ieșire din secțiunea protejată.

Operatorul __finally nu blochează căutarea unui handler de excepție corespunzător.

Dacă apare o excepție în blocul __try. Sistemul de operare trebuie să găsească un handler pentru excepție sau programul va eșua. Dacă se găsește dispozitivul de manipulare, sunt executate toate și toate blocurile __finali și executarea continuă în dispozitivul de tratare.

De exemplu, să presupunem că o serie de apeluri funcționale conectează funcția A la funcția D, după cum se arată în figura următoare. Fiecare funcție are un singur handler de terminare. Dacă se creează o excepție în funcția D și se procesează în funcția A, operatorii de terminare sunt chemați în ordinea în care sistemul eliberează stiva: D, C și B.


Ordonatorii de ordine a finalizării

Comportamentul instrucțiunii try-final este diferit de alte limbi care susțin utilizarea clauzei finale. de exemplu C #. Un operator __try poate avea fie __finally. sau __except. dar nu și pe amândouă. Dacă ambele ar trebui să fie utilizate în același timp, instrucțiunea try-except trebuie să includă o instrucțiune internă de încercare în cele din urmă. Regulile care specifică timpul de execuție pentru fiecare bloc sunt, de asemenea, diferite.

Cuvântul cheie __leave poate fi utilizat numai în secțiunea protejată a instrucțiunii try-final. Aceasta face ca execuția să meargă la capătul secțiunii protejate. Execuția continuă cu prima instrucțiune din procedura de terminare.

Instrucțiunea "goo" poate ieși și din partiția protejată, dar în acest caz performanța va scădea, deoarece stiva va fi eliberată. Operatorul __leave este mai eficient deoarece nu provoacă eliberarea teancului.

Exitând instrucțiunea "încercați în cele din urmă" cu funcția runtime lungă este considerată o terminare anormală. Trecerea la operatorul __try nu este permisă, dar să spunem ieșirea din acesta. Toți operatorii __ în cele din urmă. care sunt active între punctul de plecare (finalizarea normală a blocului __try) și destinația (de către blocul __except care procesează excepția), trebuie pornite. Aceasta se numește "promovare locală".

Dacă blocul de încercare, din orice motiv, se termină prematur (inclusiv prin ieșirea din bloc), sistemul execută blocul asociat final, ca parte a eliberării stivei. În aceste cazuri, funcția AbnormalTermination returnează TRUE dacă este apelată din blocul final; în caz contrar, returnează FALSE.

Dacă procesul este șters în timpul executării instrucțiunii try-final, manipulatorul de ieșire nu este sunat.

Finalizarea blocului, care se referă numai la sistemele Microsoft







Articole similare

Trimiteți-le prietenilor: