Instrucțiunea "try-catch" constă dintr-un bloc de încercare. urmată de una sau mai multe clauze de captură. Specificați agenți de manipulare pentru diferite excepții.
notițe
Când se produce o excepție, limbajul de rulare comun (CLR) caută o declarație de captură. care gestionează această excepție. Dacă metoda de execuție curentă nu conține un astfel de blocaj de captură. CLR caută metoda care a apelat metoda curentă și așa mai departe stivă de apeluri. Dacă blocul de captură nu este găsit, CLR afișează utilizatorului un mesaj de excepție nefolosit și oprește executarea programului.
Blocul try conține cod securizat care poate arunca o excepție. Acest bloc este executat până când o excepție este aruncată sau până când este terminată cu succes. De exemplu, următoarea încercare de a arunca un obiect nul face ca NullReferenceException să fie aruncat.
Deși clauza de captură poate fi utilizată fără argumente pentru a intercepta orice tip de excepție, această utilizare nu este recomandată. În general, ar trebui să interceptați numai acele excepții, după care știți cum să efectuați restaurarea. De aceea, trebuie să specificați întotdeauna un argument obiect care derivă din Excepție. de exemplu:
Într-un bloc de încercare-captură, puteți utiliza mai multe clase de captură definite. În acest caz, ordinea clauzelor de captură este importantă. deoarece clauzele de captură sunt verificate în ordine. Interceptați excepții mai specifice decât cele mai puțin specifice. Compilatorul aruncă o eroare dacă localizați blocurile de captură în această ordine, încât blocul ulterior nu poate fi atins niciodată.
Utilizarea argumentelor de captură reprezintă o modalitate de filtrare a excepțiilor pe care doriți să le procesați. De asemenea, puteți utiliza expresia predicate, care verifică suplimentar excepția pentru a decide dacă ar trebui procesată. Dacă expresia predicatului revine la falsă, continuă căutarea handlerului.
Filtrele de excepție sunt preferabile pentru interceptare și rechemare (explicate mai jos), deoarece filtrele părăsesc stiva intactă. Dacă mânerul ulterior descarcă teancul, puteți vedea unde sa produs inițial excepția și nu doar ultimul loc în care a fost numit. De obicei, expresiile filtru de excepție sunt utilizate pentru logare. Puteți crea o funcție predicată care întoarce mereu fals și scrie, de asemenea, ieșirea în jurnal pentru a înregistra excepțiile din jurnal în momentul în care sosesc, fără a fi nevoie să le procesați și să le rechemați.
Declarația de aruncare. inclus în blocul de captură. vă permite să re-ridicați o excepție prinsă de blocul de captură. Următorul exemplu preia informațiile sursă din IOException. și apoi această excepție este solicitată pentru metoda părinte.
Puteți intercepta o excepție și puteți apela o altă excepție. În acest caz, ar trebui să specificați excepția interceptată ca internă, după cum se arată în exemplul următor.
De asemenea, puteți re-ridica excepția atunci când este îndeplinită condiția specificată, după cum se arată în exemplul următor.
În blocul try, inițializați numai acele variabile care sunt declarate în el. În caz contrar, poate să apară o excepție înainte ca blocul să fie executat. De exemplu, în următorul exemplu de cod, variabila n este inițializată în interiorul blocului try. Încercarea de a utiliza această variabilă în afara acestui bloc de încercare în instrucțiunea Write (n) va duce la o eroare de compilator.
Pentru mai multe informații despre interceptarea excepțiilor, consultați secțiunea Try-catch-finally.
Excepții în metodele asincrone
Metoda asincronă este marcată cu un modificator asincron și conține de obicei una sau mai multe expresii sau așteaptă instrucțiuni. Instrucțiunea await aplică instrucțiunea așteptare la task sau task
Sarcina completă la care așteaptă este aplicată. poate fi într-o stare eșuată din cauza unei excepții nefolosite în metoda care returnează această sarcină. Așteptarea sarcinii cauzează o excepție. De asemenea, sarcina se poate termina în starea anulată dacă procesul asincron care returnează această activitate este anulat. În așteptarea unei sarcini anulate, se solicită funcția OperationCanceledException. Pentru informații suplimentare despre modul de anulare a unui proces asincron, consultați Finalizarea unei aplicații asincrone (C # și Visual Basic).
Pentru a prinde o excepție, așteptați sarcina din blocul de încercare și interceptați această excepție în blocul de captură corespunzător. Vedeți exemplul din secțiunea "Exemplu".
Sarcina poate fi într-o stare de eșec dacă apar mai multe excepții în metoda asincronă așteptată. De exemplu, sarcina poate fi rezultatul chemării metodei Task.WhenAll. Când se așteaptă o astfel de sarcină, se interceptă numai una dintre excepții și este imposibil să se prevadă care excepție va fi interceptată. Vedeți exemplul din secțiunea "Exemplu".
În exemplul următor, blocul try conține apelul la metoda ProcessString. care poate provoca o excepție. Clauza de captură conține un handler de excepție care afișează pur și simplu mesajul pe ecran. Când instrucțiunea aruncă este apelată de la MyMethod. sistemul caută declarația de captură și afișează mesajul Excepție prins.
Următorul exemplu utilizează două blocuri de captură și interceptează cea mai specifică excepție care apare mai întâi.
Pentru a prinde excepția cea mai puțin specifică, puteți înlocui instrucțiunea throw în ProcessString cu următoarea declarație: aruncați o nouă excepție ().
Dacă în acest exemplu, primul loc blocul de captură pentru a intercepta excepția cea mai puțin specifică, va apărea următorul mesaj de eroare: O clauză anterioară de captură captează deja toate excepțiile acestui tip sau super tip ("System.Exception").
Următorul exemplu demonstrează tratarea excepțiilor pentru metodele asincrone. Pentru a intercepta o excepție cauzată de o sarcină asincronă, plasați expresia await în blocul de încercare și interceptați această excepție în blocul de captură.
Următorul exemplu demonstrează modul de tratare a excepțiilor, în cazul în care mai multe sarcini pot avea ca rezultat câteva excepții. Blocul de încercare așteaptă o sarcină care este returnată apelând metoda Task.WhenAll. Această sarcină este finalizată după finalizarea celor trei sarcini la care este aplicată AllAll.
Fiecare dintre cele trei sarcini provoacă o excepție. Blocul de captură iterează prin excepțiile care se găsesc în proprietatea Exception.InnerExceptions a sarcinii returnate de metoda Task.WhenAll.
C # Specificarea limbii
Pentru mai multe informații, consultați specificația C #. Specificația de limbă este o sursă prescriptivă de informații despre sintaxa și utilizarea limbajului C #.