Introducció
En Python, les excepcions són una manera de gestionar errors que poden ocórrer durant l'execució d'un programa. Tot i que Python proporciona moltes excepcions integrades, de vegades és útil crear les nostres pròpies excepcions personalitzades per manejar situacions específiques de manera més clara i controlada.
Per què utilitzar excepcions personalitzades?
Les excepcions personalitzades ens permeten:
- Clarificar el codi: Podem donar noms significatius a les excepcions que reflecteixin millor el problema específic.
- Millorar la gestió d'errors: Podem afegir informació addicional a les excepcions per ajudar en la depuració.
- Organitzar millor el codi: Podem agrupar errors relacionats sota una mateixa jerarquia d'excepcions.
Creació d'Excepcions Personalitzades
Per crear una excepció personalitzada, simplement hem de definir una nova classe que hereti de la classe Exception
o qualsevol altra classe d'excepció integrada.
Exemple Bàsic
class MyCustomError(Exception): """Excepció personalitzada per a errors específics.""" pass def funció_que_pot_fallar(): raise MyCustomError("Ha ocorregut un error personalitzat") try: funció_que_pot_fallar() except MyCustomError as e: print(f"Capturada una excepció personalitzada: {e}")
Explicació del Codi
-
Definició de la Classe d'Excepció:
class MyCustomError(Exception): """Excepció personalitzada per a errors específics.""" pass
Aquí, definim una nova classe
MyCustomError
que hereta deException
. -
Generació de l'Excepció:
def funció_que_pot_fallar(): raise MyCustomError("Ha ocorregut un error personalitzat")
La funció
funció_que_pot_fallar
genera una excepció de tipusMyCustomError
amb un missatge d'error. -
Gestió de l'Excepció:
try: funció_que_pot_fallar() except MyCustomError as e: print(f"Capturada una excepció personalitzada: {e}")
Utilitzem un bloc
try-except
per capturar i gestionar l'excepció personalitzada.
Afegint Informació Addicional
Podem afegir més informació a les nostres excepcions personalitzades definint un constructor (__init__
) i emmagatzemant dades addicionals.
Exemple Amb Informació Addicional
class MyCustomError(Exception): def __init__(self, message, code): super().__init__(message) self.code = code def funció_que_pot_fallar(): raise MyCustomError("Ha ocorregut un error personalitzat", 404) try: funció_que_pot_fallar() except MyCustomError as e: print(f"Capturada una excepció personalitzada: {e} amb codi {e.code}")
Explicació del Codi
-
Definició de la Classe d'Excepció amb Informació Addicional:
class MyCustomError(Exception): def __init__(self, message, code): super().__init__(message) self.code = code
Aquí, afegim un constructor que accepta un missatge i un codi d'error, i els emmagatzema com a atributs de la classe.
-
Generació de l'Excepció amb Informació Addicional:
def funció_que_pot_fallar(): raise MyCustomError("Ha ocorregut un error personalitzat", 404)
-
Gestió de l'Excepció i Accés a la Informació Addicional:
try: funció_que_pot_fallar() except MyCustomError as e: print(f"Capturada una excepció personalitzada: {e} amb codi {e.code}")
Exercicis Pràctics
Exercici 1: Creació d'una Excepció Personalitzada
Descripció:
Crea una excepció personalitzada anomenada InvalidAgeError
que es generi quan es passi una edat no vàlida (menor que 0 o major que 120) a una funció check_age
.
Codi:
class InvalidAgeError(Exception): def __init__(self, age): super().__init__(f"Edat no vàlida: {age}") self.age = age def check_age(age): if age < 0 or age > 120: raise InvalidAgeError(age) print("Edat vàlida") # Prova la funció try: check_age(-5) except InvalidAgeError as e: print(e)
Solució:
class InvalidAgeError(Exception): def __init__(self, age): super().__init__(f"Edat no vàlida: {age}") self.age = age def check_age(age): if age < 0 o age > 120: raise InvalidAgeError(age) print("Edat vàlida") # Prova la funció try: check_age(-5) except InvalidAgeError as e: print(e)
Exercici 2: Excepció Personalitzada amb Informació Addicional
Descripció:
Crea una excepció personalitzada anomenada TransactionError
que accepti un missatge d'error i un codi de transacció. Genera aquesta excepció en una funció process_transaction
si la transacció falla.
Codi:
class TransactionError(Exception): def __init__(self, message, transaction_id): super().__init__(message) self.transaction_id = transaction_id def process_transaction(transaction_id, amount): if amount < 0: raise TransactionError("Quantitat negativa no permesa", transaction_id) print("Transacció processada correctament") # Prova la funció try: process_transaction(12345, -100) except TransactionError as e: print(f"Error en la transacció {e.transaction_id}: {e}")
Solució:
class TransactionError(Exception): def __init__(self, message, transaction_id): super().__init__(message) self.transaction_id = transaction_id def process_transaction(transaction_id, amount): if amount < 0: raise TransactionError("Quantitat negativa no permesa", transaction_id) print("Transacció processada correctament") # Prova la funció try: process_transaction(12345, -100) except TransactionError as e: print(f"Error en la transacció {e.transaction_id}: {e}")
Conclusió
Les excepcions personalitzades són una eina poderosa per millorar la gestió d'errors en els nostres programes Python. Ens permeten crear errors més significatius i proporcionar informació addicional que pot ser molt útil durant la depuració. Amb la pràctica, aprendràs a utilitzar-les de manera efectiva per fer que el teu codi sigui més robust i fàcil de mantenir.
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