logo

Gestió d'excepcions de Python

Hem explorat Python bàsic fins ara del conjunt 1 al 4 ( Set 1 | Set 2 | Set 3 | Set 4 ).

En aquest article, parlarem de com gestionar les excepcions a Python mitjançant try, except i, finalment, declaracions amb l'ajuda d'exemples adequats.



L'error a Python pot ser de dos tipus, és a dir. Errors de sintaxi i excepcions . Els errors són problemes en un programa a causa dels quals el programa aturarà l'execució. D'altra banda, es plantegen excepcions quan es produeixen alguns esdeveniments interns que modifiquen el flux normal del programa.

Diferents tipus d'excepcions a Python:

A Python, hi ha diverses excepcions de Python incorporades que es poden generar quan es produeix un error durant l'execució d'un programa. Aquests són alguns dels tipus d'excepcions més comuns a Python:

  • Error de sintaxi: Aquesta excepció es planteja quan l'intèrpret troba un error de sintaxi al codi, com ara una paraula clau mal escrita, dos punts que falten o un parèntesi desequilibrat.
  • TypeError : aquesta excepció es planteja quan s'aplica una operació o funció a un objecte del tipus incorrecte, com ara afegir una cadena a un nombre enter.
  • Error de nom : aquesta excepció es planteja quan no es troba una variable o un nom de funció a l'àmbit actual.
  • IndexError : aquesta excepció es planteja quan un índex està fora de l'interval per a una llista, tupla o altres tipus de seqüència.
  • KeyError : aquesta excepció es planteja quan no es troba una clau en un diccionari.
  • ValueError : aquesta excepció es planteja quan es crida una funció o un mètode amb un argument o entrada no vàlid, com ara intentar convertir una cadena en un nombre enter quan la cadena no representa un nombre enter vàlid.
  • Error d'atribut : aquesta excepció es planteja quan no es troba un atribut o mètode en un objecte, com ara intentar accedir a un atribut inexistent d'una instància de classe.
  • IOError : aquesta excepció es genera quan una operació d'E/S, com ara llegir o escriure un fitxer, falla a causa d'un error d'entrada/sortida.
  • ZeroDivisionError : aquesta excepció es planteja quan s'intenta dividir un nombre per zero.
  • Error d'importació : aquesta excepció es planteja quan una instrucció d'importació no pot trobar o carregar un mòdul.

Aquests són només alguns exemples dels molts tipus d'excepcions que es poden produir a Python. És important gestionar correctament les excepcions al codi mitjançant blocs try-except o altres tècniques de gestió d'errors, per tal de gestionar els errors amb gràcia i evitar que el programa es bloquegi.



Diferència entre error de sintaxi i excepcions

Error de sintaxi: Com el seu nom indica, aquest error és causat per una sintaxi incorrecta al codi. Condueix a la finalització del programa.

Exemple:

Hi ha un error de sintaxi al codi. El if'> La declaració ha d'anar seguida de dos punts (:>), i la print'> La declaració s'ha de sagnar per estar dins de if'> bloc.



Python 3




amount>=> 10000> if>(amount>>2999>)> print>(>'You are eligible to purchase Dsa Self Paced'>)>

>

>

Sortida:

Excepcions: Es plantegen excepcions quan el programa és sintàcticament correcte, però el codi provoca un error. Aquest error no atura l'execució del programa, però canvia el flux normal del programa.

Exemple:

Aquí en aquest codi estem dividint el 'marques' per zero, de manera que es produirà un error conegut com 'ZeroDivisionError'

Python 3




marks>=> 10000> a>=> marks>/> 0> print>(a)>

>

>

Sortida:

A l'exemple anterior s'ha generat el ZeroDivisionError mentre estem intentant dividir un nombre per 0.

Nota: L'excepció és la classe base per a totes les excepcions a Python. Podeu comprovar la jerarquia d'excepcions aquí .

Exemple:

1) TypeError: aquesta excepció es planteja quan s'aplica una operació o funció a un objecte del tipus incorrecte. Aquí teniu un exemple:
Aquí a 'TypeError' es planteja ja que els dos tipus de dades són diferents que s'estan afegint.

Python 3




x>=> 5> y>=> 'hello'> z>=> x>+> y>

>

>

output:  Traceback (most recent call last):  File '7edfa469-9a3c-4e4d-98f3-5544e60bff4e.py', line 4, in   z = x + y TypeError: unsupported operand type(s) for +: 'int' and 'str'>

prova catch block per resoldre'l:

El codi intenta afegir un nombre enter ( x'> ) i una cadena ( y'> ) junts, que no és una operació vàlida, i generarà a TypeError'> . El codi utilitzat a try'> i except'> bloquejar per detectar aquesta excepció i imprimir un missatge d'error.

Python 3




x>=> 5> y>=> 'hello'> try>:> >z>=> x>+> y> except> TypeError:> >print>(>'Error: cannot add an int and a str'>)>

>

>

Sortida

Error: cannot add an int and a str>

Declaració Try and Except: captura d'excepcions

Les sentències Try and except s'utilitzen per detectar i gestionar excepcions a Python. Les sentències que poden generar excepcions es guarden dins de la clàusula try i les que gestionen l'excepció s'escriuen dins de la clàusula excepte.

Exemple: Aquí estem intentant accedir a l'element de matriu l'índex del qual està fora de límit i gestionar l'excepció corresponent.

Python 3




a>=> [>1>,>2>,>3>]> try>:> >print> (>'Second element = %d'> %>(a[>1>]))> >print> (>'Fourth element = %d'> %>(a[>3>]))> except>:> >print> (>'An error occurred'>)>

>

>

Sortida

Second element = 2 An error occurred>

A l'exemple anterior, les declaracions que poden causar l'error es col·loquen dins de la instrucció try (segona sentència d'impressió en el nostre cas). La segona instrucció d'impressió intenta accedir al quart element de la llista que no hi és i això genera una excepció. Aleshores, aquesta excepció queda atrapada per la declaració except.

Captura d'excepcions específiques

Una instrucció try pot tenir més d'una clàusula excepte, per especificar controladors per a diferents excepcions. Tingueu en compte que s'executarà com a màxim un gestor. Per exemple, podem afegir IndexError al codi anterior. La sintaxi general per afegir excepcions específiques és:

try:  # statement(s) except IndexError:  # statement(s) except ValueError:  # statement(s)>

Exemple: Captura d'excepcions específiques a Python

El codi defineix una funció fun(a)'> que calculab>basat en l'entradaa>. Sia>és inferior a 4, intenta una divisió per zero, provocant a ZeroDivisionError'> . El codi trucafun(3)>ifun(5)>dins d'un bloc try-except. S'encarrega de laZeroDivisionError>perfun(3)>i estampats ZeroDivisionError s'ha produït i gestionat. El NameError'> bloc no s'executa ja que no n'hi ha NameError'> excepcions al codi.

Python 3




def> fun(a):> >if> a <>4>:> >b>=> a>/>(a>->3>)> >print>(>'Value of b = '>, b)> > try>:> >fun(>3>)> >fun(>5>)> except> ZeroDivisionError:> >print>(>'ZeroDivisionError Occurred and Handled'>)> except> NameError:> >print>(>'NameError Occurred and Handled'>)>

>

>

Sortida

ZeroDivisionError Occurred and Handled>

Si comenteu la línia fun(3), la sortida serà

NameError Occurred and Handled>

La sortida anterior és així perquè tan aviat com Python intenta accedir al valor de b, es produeix NameError.

Prova amb la clàusula Else

A Python, també podeu utilitzar la clàusula else al bloc try-except que ha d'estar present després de totes les clàusules excepte. El codi entra al bloc else només si la clàusula try no genera cap excepció.

Prova amb la clàusula else

El codi defineix una funció AbyB(a, b)> que calculac>com ((a+b) / (a-b)) i maneja un potencialZeroDivisionError>. Imprimeix el resultat si no hi ha error de divisió per zero. Trucant AbyB(2.0, 3.0)> calcula i imprimeix-5.0>, mentre truca AbyB(3.0, 3.0)> intenta dividir per zero, donant lloc a a ZeroDivisionError> , que s'agafa i a/b resulta en 0 està imprès.

Python 3




def> AbyB(a , b):> >try>:> >c>=> ((a>+>b)>/> (a>->b))> >except> ZeroDivisionError:> >print> (>'a/b result in 0'>)> >else>:> >print> (c)> AbyB(>2.0>,>3.0>)> AbyB(>3.0>,>3.0>)>

>

>

Sortida:

-5.0 a/b result in 0>

Finalment, paraula clau en Python

Python proporciona una paraula clau finalment , que sempre s'executa després dels blocs try i except. El bloc final sempre s'executa després de la finalització normal del bloc try o després que el bloc try finalitzi a causa d'alguna excepció.

Sintaxi:

try:  # Some Code....   except:  # optional block  # Handling of exception (if required)  else:  # execute if no exception  finally:  # Some code .....(always executed)>

Exemple:

El codi intenta realitzar una divisió entera per zero, donant com a resultat a ZeroDivisionError> . Capta l'excepció i imprimeix No es pot dividir per zero. Independentment de l'excepció, elfinally>s'executa el bloc i s'imprimeix Això sempre s'executa.

Python 3




try>:> >k>=> 5>/>/>0> >print>(k)> except> ZeroDivisionError:> >print>(>'Can't divide by zero'>)> finally>:> >print>(>'This is always executed'>)>

apilar en java

>

>

Sortida:

Can't divide by zero This is always executed>

Aixecant l'excepció

El aixecar declaració permet al programador forçar que es produeixi una excepció específica. L'únic argument de la pujada indica l'excepció que cal plantejar. Aquesta ha de ser una instància d'excepció o una classe d'excepció (una classe que deriva d'Exception).

Aquest codi planteja intencionadament aNameError>amb el missatge Hola utilitzant elraise>declaració dins atry>bloc. Aleshores, agafa elNameError>excepció, estampats Una excepció, i torna a plantejar la mateixa excepció utilitzantraise>. Això demostra com es poden generar i gestionar excepcions a Python, permetent missatges d'error personalitzats i una propagació addicional d'excepcions.

Python 3




try>:> >raise> NameError(>'Hi there'>)> except> NameError:> >print> (>'An exception'>)> >raise>

>

>

La sortida del codi anterior només s'imprimirà com una excepció, però també es produirà un error en temps d'execució a l'últim a causa de la instrucció de pujada a l'última línia. Per tant, la sortida de la vostra línia d'ordres semblarà

Traceback (most recent call last):  File '/home/d6ec14ca595b97bff8d8034bbf212a9f.py', line 5, in   raise NameError('Hi there') # Raise Error NameError: Hi there>

Avantatges de la gestió d'excepcions:

  • Millora de la fiabilitat del programa : Si gestioneu correctament les excepcions, podeu evitar que el vostre programa es bloquegi o produeixi resultats incorrectes a causa d'errors o d'entrada inesperats.
  • Tractament d'errors simplificat : La gestió d'excepcions us permet separar el codi de gestió d'errors de la lògica del programa principal, facilitant la lectura i el manteniment del vostre codi.
  • Codi de neteja: Amb el maneig d'excepcions, podeu evitar utilitzar declaracions condicionals complexes per comprovar si hi ha errors, donant lloc a un codi més net i llegible.
  • Depuració més fàcil : Quan es genera una excepció, l'intèrpret de Python imprimeix un traçat que mostra la ubicació exacta on s'ha produït l'excepció, facilitant la depuració del codi.

Desavantatges de la gestió d'excepcions:

  • Descàrrega general de rendiment: El maneig d'excepcions pot ser més lent que utilitzar declaracions condicionals per comprovar si hi ha errors, ja que l'intèrpret ha de realitzar un treball addicional per detectar i gestionar l'excepció.
  • Augment de la complexitat del codi : El maneig d'excepcions pot fer que el vostre codi sigui més complex, especialment si heu de gestionar diversos tipus d'excepcions o implementar una lògica complexa de gestió d'errors.
  • Possibles riscos de seguretat: Les excepcions gestionades de manera inadequada poden revelar informació sensible o crear vulnerabilitats de seguretat al vostre codi, per la qual cosa és important gestionar les excepcions amb cura i evitar exposar massa informació sobre el vostre programa.

En general, els avantatges del maneig d'excepcions a Python superen els inconvenients, però és important utilitzar-lo amb criteri i cura per mantenir la qualitat del codi i la fiabilitat del programa.

Aquest article és contribuït per Nikhil Kumar Singh (nickzuck_007)