Cum se tratează excepțiile în Python

Este foarte frecvent întâlnirea erorilor în timpul executării unui program. Două tipuri comune de erori pe care ar putea să le rezolvați sunt erorile și excepțiile de sintaxă. Eroare de sintaxă apar atunci când introduceți incorect codul. În astfel de cazuri, linia eronată este repetată de parser cu o săgeată îndreptată spre cea mai veche locație unde a fost detectată eroarea.

Excepțiile sunt diferite de erorile de sintaxă. Ele apar în timpul executării unui program când se întâmplă ceva neașteptat. De exemplu, să presupunem că cereți utilizatorului să introducă un număr pentru a efectua o divizare. Acum, dacă utilizatorul introduce un șir în loc de un număr și încercați să împărțiți un număr prin intrarea dată, programul va afișa o Eroare de scris

Când nu gestionați în mod corespunzător excepțiile, programul se va opri brusc, deoarece nu va ști ce să facă în astfel de cazuri. Următorul cod este un astfel de exemplu:

Keep_asking = Adevărat în timp ce keep_asking: x = int (introduceți ("Introduceți un număr:")) print ("Împărțiți 50 de", x "

Atâta timp cât introduceți o valoare de intrare integrală, programul va funcționa corect. Cu toate acestea, de îndată ce introduceți un șir sau chiar un număr zecimal ca intrare, veți obține o ValueError excepție.

În acest tutorial, veți învăța cum să gestionați corect și să ridicați excepții în Python.

Unele excepții comune

Iată câteva excepții de bază pe care le-ați putea întâlni la scrierea programelor. Puteți citi despre multe excepții încorporate pe site-ul oficial.

  • NameError: Această excepție este ridicată atunci când programul nu poate găsi un nume local sau global. Numele care nu a putut fi găsit este inclus în mesajul de eroare.
  • Eroare de scris: Această excepție este ridicată atunci când o funcție este trecută ca obiect al unui tip necorespunzător ca argument. Mai multe detalii despre tipul greșit sunt furnizate în mesajul de eroare.
  • ValueError: Această excepție apare atunci când un argument de funcție are tipul corect, dar o valoare necorespunzătoare. 
  • NotImplementedError: Această excepție este ridicată atunci când un obiect ar trebui să susțină o operație, dar nu a fost încă implementat. Nu trebuie să utilizați această eroare atunci când funcția dată nu este menită să susțină tipul de argument de intrare. În acele situații, ridicarea a Eroare de scris excepție este mai adecvată.
  • ZeroDivisionError: Această excepție este ridicată când furnizați cel de-al doilea argument pentru o divizare sau funcționare modulo ca zero.
  • FileNotFoundError: Această excepție este generată atunci când fișierul sau directorul pe care programul solicitat nu există.

La fel ca și cele de mai sus, cele mai multe excepții au nume explicite.

Tratarea unei excepții

Codul de la începutul articolului a cerut utilizatorilor să introducă un număr întreg ca intrare. Dacă utilizatorul nu a furnizat o intrare întreg, programul a oprit execuția și a ridicat o excepție de eroare de valoare. În această secțiune, vom scrie un cod pentru a spune utilizatorului că intrarea lor nu este o valoare integeră valabilă.

Primul pas al procesului este includerea codului pe care îl credeți că ar putea ridica o excepție în interiorul lui încerca clauză. Următorul pas este să utilizați cu exceptia cuvinte cheie pentru a face față excepției care a apărut în codul de mai sus. Codul modificat pentru intrarea utilizatorului va arăta astfel:

Keep_asking = Adevărat în timp ce keep_asking: try: x = int (introduceți ("Introduceți un număr:")) print (" Intrarea nu a fost un număr întreg. Încercați din nou ... ")

Ce se întâmplă aici este că programul încearcă să execute codul în interiorul lui încerca clauză. Dacă nu a fost invocată nicio excepție, programul va ignora cu exceptia clauza și restul codului se execută în mod normal. Dacă se generează o excepție, programul ignoră codul rămas din interiorul lui încerca clauza și tipul excepției sunt însoțite de numele excepției după cu exceptia cuvinte cheie. În cazul unui meci, codul din interiorul lui cu exceptia clauza este executată mai întâi și apoi restul codului după încerca clauza este executată în mod normal.

Când introduceți un număr întreg ca intrare, programul vă oferă rezultatul final al diviziunii. Când este furnizată o valoare non-integrală, programul imprimă un mesaj care vă cere să încercați să introduceți din nou un întreg. Rețineți că de această dată, programul nu se oprește brusc când furnizați o intrare nevalidă.

Puteți avea mai multe cu exceptia clauze pentru a face față diferitelor excepții. Rețineți că acești agenți de manipulare se vor ocupa numai de excepțiile care au apărut în secțiunea corespunzătoare încerca clauză. Ei nu vor face față niciunei excepții ridicate în cadrul altor proceduri de tratare a excepțiilor.

De asemenea, puteți gestiona mai multe excepții utilizând un singur cu exceptia clauza prin trecerea acestor excepții la clauză ca a tuplu.

cu excepția (ZeroDivisionError, ValueError, TypeError): print ("Ceva a mers prost ...") # code pentru a face față excepției

În cele din urmă, puteți renunța și la numele excepției după cu exceptia cuvinte cheie. În general, acest lucru nu este recomandat, deoarece codul va capta acum toate excepțiile și le va manipula în același mod. Acest lucru nu este optim deoarece vă veți ocupa de a Eroare de scris cu excepția aceluiași mod ca și cum ați fi tratat o ZeroDivisionError excepție. Atunci când se lucrează cu excepții, este mai bine să fie cât mai concret posibil și să prindeți doar ceea ce puteți face.

O posibilă utilizare a capturilor tuturor excepțiilor este de a imprima în mod corespunzător eroarea de excepție pe ecran, cum ar fi următorul cod:

Importul de matematică sys try: result = math.factorial (2.4) cu excepția: print ("Ceva neașteptat sa întâmplat.", sys.exc_info () [0]) alt: print ("Factorul este"

Utilizarea clauzei

Puteți utiliza, de asemenea, un altfel clauza în a încercați ... cu excepția afirmație. altfel clauza este menită să conțină codul care trebuie executat dacă încerca clauza nu a generat excepții. Acest lucru poate fi util pentru a vă asigura că nu adăugați niciun cod la încerca bloc ale cărui excepții nu intenționați să le luați. Un lucru care merită menționat este că dacă decideți să utilizați un altfel clauza, ar trebui să o includeți după toate cu exceptia clauze, dar înainte de in cele din urma bloc.

În cazul nostru, am putea muta linia care imprimă rezultatul diviziunii noastre în interiorul altfel bloc.

Keep_asking = Adevărat în timp ce keep_asking: încercați: x = int (introduceți ("Introduceți un număr:")), cu excepția ValueError: print (Inputul nu a fost un număr întreg valid. prin ", x" vă va oferi: ", 50 / x)

Curățarea prin utilizarea clauzei finale

Să presupunem că ați scris un cod înăuntru încerca care ar trebui să îndeplinească o sarcină utilizând o cantitate mare de resurse. Este important să eliberați aceste resurse înapoi când ați terminat să le utilizați. Acest lucru poate fi ușor realizat prin utilizarea in cele din urma clauză. 

Codul din interiorul lui in cele din urma clauza este executată întotdeauna indiferent dacă încerca bloc a ridicat o excepție. Puteți verifica acest lucru executând următorul cod:

Keep_asking = Adevărat în timp ce keep_asking: încercați: x = int (introduceți ("Introduceți un număr:")), cu excepția ValueError: print (Inputul nu a fost un număr întreg valid. cu ", x," vă va da: ", 50 / x) în cele din urmă: tipăriți (" Ați făcut deja totul necesar ").

În cazul în care oricare dintre cu exceptia clauzele pe care le-ați specificat nu fac față excepției ridicate, aceeași excepție este ridicată din nou după executarea codului în interiorul in cele din urma bloc.

Un exemplu mai complex

În această secțiune, vom scrie un program pentru a face față mai multor excepții. La fel ca exemplele anterioare, vom efectua unele operații matematice. Cu toate acestea, de data aceasta vom lua intrarea dintr-o listă.

Următorul cod verifică două excepții, Eroare de scris și ValueError. altfel bloc este utilizat pentru a imprima factorial. Puteți vedea în ieșire că acest cod este executat numai atunci când nu se ridică nicio excepție.

import math number_list = [10, -5,1,2, apple] pentru numărul din numărul_list: try: number_factorial = math.factorial (număr) cu excepția TypeError: print (cu excepția ValueError : print ("Factorialul lui", numărul, "este", numărul_factorial) în cele din urmă: print ("Eliberați orice resurse in folosinta.")

Codul de mai sus produce următoarea ieșire:

Factorul de 10 este 3628800 Eliberarea oricăror resurse în uz. Factorial acceptă numai valori întregi pozitive. -5 nu este un număr întreg pozitiv. Eliberarea oricăror resurse în uz. Factorial acceptă numai valori întregi pozitive. 1.2 nu este un număr întreg pozitiv. Eliberarea oricăror resurse în uz. Factorial nu este acceptat pentru tipul de intrare dat. Eliberarea oricăror resurse în uz.

Un alt lucru care merită remarcat este că codul din interiorul lui in cele din urma clauza este executată pentru fiecare element din listă.

Gândurile finale

Sper că acest tutorial v-a ajutat să înțelegeți tratarea excepțiilor în Python. În plus, nu ezitați să vedeți ce avem la dispoziție pentru vânzare și pentru a studia pe piață și nu ezitați să întrebați orice întrebări și să furnizați feedback-ul valoros utilizând feedul de mai jos.

Manipularea excepțiilor în mod corespunzător poate fi foarte utilă în situațiile în care ieșirea dintr-un program după ce primește o intrare neașteptată nu este viabilă. Dacă aveți întrebări legate de tratarea excepțiilor în Python, anunțați-ne în comentariile respective. 

Aflați Python

Aflați Python cu ghidul nostru complet de instrucțiuni Python, indiferent dacă sunteți doar începători sau sunteți un coder experimentat în căutarea unor noi abilități.

Cod