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

  1. 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 de Exception.

  2. 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 tipus MyCustomError amb un missatge d'error.

  3. 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

  1. 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.

  2. Generació de l'Excepció amb Informació Addicional:

    def funció_que_pot_fallar():
        raise MyCustomError("Ha ocorregut un error personalitzat", 404)
    
  3. 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

Mòdul 2: Estructures de Control

Mòdul 3: Funcions i Mòduls

Mòdul 4: Estructures de Dades

Mòdul 5: Programació Orientada a Objectes

Mòdul 6: Gestió de Fitxers

Mòdul 7: Gestió d'Errors i Excepcions

Mòdul 8: Temes Avançats

Mòdul 9: Proves i Depuració

Mòdul 10: Desenvolupament Web amb Python

Mòdul 11: Ciència de Dades amb Python

Mòdul 12: Projecte Final

© Copyright 2024. Tots els drets reservats