Le eccezioni definite dall'utente vengono create definendo una nuova classe da cui eredita L'eccezione incorporata di Python classe o una delle sue sottoclassi. In questo modo possiamo creare messaggi di errore personalizzati e gestire errori specifici in un modo che abbia senso per la nostra applicazione.
Passaggi per creare e utilizzare eccezioni definite dall'utente
Segui questi passaggi per creare e utilizzare le eccezioni definite dall'utente in Python:
- Definire una nuova classe di eccezione: Crea una nuova classe che eredita da Exception o da una qualsiasi delle sue sottoclassi.
- Sollevare l'eccezione: Utilizzare l'istruzione raise per sollevare l'eccezione definita dall'utente quando si verifica una condizione specifica.
- Gestire l'eccezione: Utilizzare i blocchi try-eccetto per gestire l'eccezione definita dall'utente.
Esempio: In questo esempio creiamo un'eccezione personalizzata InvalidAgeError per garantire che i valori di età rientrino in un intervallo valido (0–120).
array javaPython
# Step 1: Define a custom exception class class InvalidAgeError(Exception): def __init__(self age msg='Age must be between 0 and 120'): self.age = age self.msg = msg super().__init__(self.msg) def __str__(self): return f'{self.age} -> {self.msg}' # Step 2: Use the custom exception in your code def set_age(age): if age < 0 or age > 120: raise InvalidAgeError(age) else: print(f'Age set to: {age}') # Step 3: Handling the custom exception try: set_age(150) # This will raise the custom exception except InvalidAgeError as e: print(e)
Produzione
150 -> Age must be between 0 and 120
Spiegazione:
- La classe InvalidAgeError eredita da Exception. Definisce un __caldo__ metodo per accettare età e messaggio.
- Il metodo __str__ restituisce una rappresentazione di stringa leggibile dell'errore.
- In set_age() se l'età non è compresa nell'intervallo valido (0–120) viene sollevata l'eccezione.
- Il blocco try-eccetto rileva l'eccezione e stampa il messaggio di errore.
Personalizzazione delle classi di eccezioni
Quando creiamo un'eccezione personalizzata sottoclassiamo la classe Exception incorporata di Python (o una sottoclasse come ValueError TypeError ecc.). Possiamo quindi aggiungere i nostri metodi di attributi o la logica personalizzata per rendere la nostra eccezione più informativa.
Possiamo anche migliorare le eccezioni personalizzate aggiungendo attributi extra o sovrascrivendo metodi.
Esempio: Qui miglioriamo InvalidAgeError aggiungendo un codice di errore e personalizzando il messaggio di errore.
Pythonclass InvalidAgeError(Exception): def __init__(self age msg='Age must be between 0 and 120' error_code=1001): self.age = age self.msg = msg self.error_code = error_code super().__init__(self.msg) def __str__(self): return f'[Error Code {self.error_code}] {self.age} -> {self.msg}' try: set_age(150) # This will raise the custom exception except InvalidAgeError as e: print(e)
Produzione
[Error Code 1001] 150 -> Age must be between 0 and 120
Spiegazione:
attraversamento dell'albero in ordine
- InvalidAgeError ora ha un attributo aggiuntivo error_code.
- Il metodo __str__ viene sovrascritto per visualizzare sia il codice di errore che l'età.
- Quando viene eseguito set_age(150), l'eccezione viene sollevata e catturata nel blocco try-Exception.
- Viene stampato il messaggio di errore personalizzato rendendo l'errore più descrittivo.
Utilizzo delle eccezioni standard come classe base
A volte invece di ereditare direttamente da Exception possiamo creare un'eccezione personalizzata sottoclassando un'eccezione standard come RuntimeError ValueError ecc. Ciò è utile quando l'eccezione personalizzata deve essere trattata come un tipo specifico di errore.
Esempio: Questo esempio mostra come creare un'eccezione personalizzata NetworkError ereditando da RuntimeError che è un'eccezione incorporata standard.
Python# NetworkError has base RuntimeError and not Exception class NetworkError(RuntimeError): def __init__(self arg): self.args = (arg) # store as tuple try: raise NetworkError('Connection failed') except NetworkError as e: print(e.args)
Produzione
('Connection failed') Spiegazione:
- NetworkError eredita da RuntimeError che è un tipo di eccezione incorporata.
- Quando sollevato, il messaggio viene archiviato nell'attributo args come una tupla.
- L'eccezione viene intercettata e vengono visualizzati i relativi argomenti memorizzati.
Esempio reale: errore di posta elettronica non valida
Ecco un semplice esempio in cui solleviamo un'eccezione personalizzata se l'indirizzo email non è valido:
Pythonclass InvalidEmailError(Exception): def __init__(self email msg='Invalid email format'): self.email = email self.msg = msg super().__init__(self.msg) def __str__(self): return f'{self.email} -> {self.msg}' def set_email(email): if '@' not in email: raise InvalidEmailError(email) print(f'Email set to: {email}') try: set_email('userexample.com') except InvalidEmailError as e: print(e)
Produzione
userexample.com -> Invalid email format
Spiegazione:
- Viene definita una nuova classe di eccezione InvalidEmailError per convalidare gli indirizzi e-mail.
- Se l'e-mail specificata non contiene "@" viene sollevata un'eccezione.
- Il blocco try-eccetto rileva l'errore e stampa il messaggio formattato.
Quando utilizzare le eccezioni definite dall'utente?
Le eccezioni definite dall'utente dovrebbero essere prese in considerazione nei seguenti scenari:
int raddoppiare
- Rappresentare errori specifici in un'applicazione (ad esempio InvalidAgeError DatabaseConnectionError).
- Fornire messaggi di errore più chiari e descrittivi.
- Gestire separatamente un gruppo di errori correlati utilizzando tranne.
Utilizzando le eccezioni definite dall'utente, i programmi diventano più leggibili, gestibili e più facili da eseguire il debug.