La gestió d'excepcions és una part fonamental de la programació en Python. Ens permet manejar errors i situacions inesperades de manera controlada, evitant que el programa es bloquegi i proporcionant una millor experiència d'usuari. En aquesta secció, aprendrem com capturar i gestionar excepcions utilitzant les estructures try
, except
, else
i finally
.
Conceptes Clau
- Excepcions: Errors que es produeixen durant l'execució d'un programa.
- Blocs
try
iexcept
: Estructures per capturar i gestionar excepcions. - Blocs
else
ifinally
: Estructures opcionals per afegir lògica addicional després de gestionar una excepció.
Blocs try
i except
El bloc try
conté el codi que pot generar una excepció. Si es produeix una excepció, el bloc except
captura l'error i executa el codi corresponent.
Sintaxi
Exemple
En aquest exemple, es produeix una excepció ZeroDivisionError
quan intentem dividir per zero. El bloc except
captura l'excepció i imprimeix un missatge d'error.
Captura d'Excepcions Específiques
Podem capturar diferents tipus d'excepcions especificant el tipus d'excepció després de la paraula clau except
.
Exemple
try: fitxer = open('fitxer_inexistent.txt', 'r') except FileNotFoundError: print("Error: El fitxer no existeix.") except IOError: print("Error: Problema d'entrada/sortida.")
En aquest exemple, capturem dues excepcions diferents: FileNotFoundError
i IOError
.
Blocs else
i finally
El bloc else
s'executa si no es produeix cap excepció, mentre que el bloc finally
s'executa sempre, independentment de si es produeix una excepció o no.
Exemple
try: fitxer = open('fitxer.txt', 'r') contingut = fitxer.read() except FileNotFoundError: print("Error: El fitxer no existeix.") else: print("El fitxer s'ha llegit correctament.") finally: fitxer.close() print("El fitxer s'ha tancat.")
En aquest exemple, el bloc else
s'executa si el fitxer s'obre i es llegeix correctament, mentre que el bloc finally
s'executa sempre per assegurar que el fitxer es tanqui.
Exercicis Pràctics
Exercici 1
Escriu un programa que demani a l'usuari que introdueixi dos nombres i mostri el resultat de la seva divisió. Gestiona l'excepció ZeroDivisionError
per evitar que el programa es bloquegi si l'usuari introdueix zero com a divisor.
Solució
try: num1 = float(input("Introdueix el primer nombre: ")) num2 = float(input("Introdueix el segon nombre: ")) resultat = num1 / num2 except ZeroDivisionError: print("Error: No es pot dividir per zero.") except ValueError: print("Error: Si us plau, introdueix un nombre vàlid.") else: print(f"El resultat de la divisió és: {resultat}")
Exercici 2
Escriu un programa que intenti obrir un fitxer i llegir-ne el contingut. Gestiona les excepcions FileNotFoundError
i IOError
per proporcionar missatges d'error adequats.
Solució
try: fitxer = open('fitxer_inexistent.txt', 'r') contingut = fitxer.read() except FileNotFoundError: print("Error: El fitxer no existeix.") except IOError: print("Error: Problema d'entrada/sortida.") else: print("El contingut del fitxer és:") print(contingut) finally: try: fitxer.close() except NameError: pass print("El fitxer s'ha tancat (si estava obert).")
Errors Comuns i Consells
- No capturar excepcions específiques: Capturar excepcions generals (
Exception
) pot amagar errors específics que necessiten una gestió diferent. - No tancar recursos: Assegura't de tancar fitxers o altres recursos al bloc
finally
per evitar fuites de recursos. - No proporcionar informació d'error útil: Proporciona missatges d'error clars i útils per ajudar a diagnosticar problemes.
Resum
En aquesta secció, hem après com gestionar excepcions en Python utilitzant els blocs try
, except
, else
i finally
. Hem vist com capturar excepcions específiques i com assegurar-nos que els recursos es tanquin correctament. També hem practicat amb exercicis per reforçar aquests conceptes. La gestió d'excepcions és una habilitat essencial per escriure codi robust i fiable.
Curs de Programació en Python
Mòdul 1: Introducció a Python
- Introducció a Python
- Configuració de l'Entorn de Desenvolupament
- Sintaxi de Python i Tipus de Dades Bàsics
- Variables i Constants
- Entrada i Sortida Bàsiques
Mòdul 2: Estructures de Control
Mòdul 3: Funcions i Mòduls
- Definició de Funcions
- Arguments de Funció
- Funcions Lambda
- Mòduls i Paquets
- Visió General de la Biblioteca Estàndard
Mòdul 4: Estructures de Dades
Mòdul 5: Programació Orientada a Objectes
Mòdul 6: Gestió de Fitxers
- Lectura i Escriptura de Fitxers
- Treballant amb Fitxers CSV
- Gestió de Dades JSON
- Operacions amb Fitxers i Directoris
Mòdul 7: Gestió d'Errors i Excepcions
Mòdul 8: Temes Avançats
- Decoradors
- Generadors
- Gestors de Context
- Concurrència: Fils i Processos
- Asyncio per a Programació Asíncrona
Mòdul 9: Proves i Depuració
- Introducció a les Proves
- Proves Unitàries amb unittest
- Desenvolupament Guiat per Proves
- Tècniques de Depuració
- Ús de pdb per a la Depuració
Mòdul 10: Desenvolupament Web amb Python
- Introducció al Desenvolupament Web
- Conceptes Bàsics del Framework Flask
- Construcció d'APIs REST amb Flask
- Introducció a Django
- Construcció d'Aplicacions Web amb Django
Mòdul 11: Ciència de Dades amb Python
- Introducció a la Ciència de Dades
- NumPy per al Càlcul Numèric
- Pandas per a la Manipulació de Dades
- Matplotlib per a la Visualització de Dades
- Introducció al Machine Learning amb scikit-learn