In questo tutorial imparerai come definire eccezioni personalizzate in base alle tue esigenze con l'aiuto di esempi.
Python ha numerose eccezioni integrate che costringono il tuo programma a restituire un errore quando qualcosa nel programma va storto.
Tuttavia, a volte potrebbe essere necessario creare le proprie eccezioni personalizzate che servono al proprio scopo.
Creazione di eccezioni personalizzate
In Python, gli utenti possono definire eccezioni personalizzate creando una nuova classe. Questa classe di eccezione deve essere derivata, direttamente o indirettamente, dalla Exception
classe incorporata . Anche la maggior parte delle eccezioni incorporate derivano da questa classe.
>>> class CustomError(Exception):… pass… >>> raise CustomError Traceback (most recent call last):… __main__.CustomError >>> raise CustomError("An error occurred") Traceback (most recent call last):… __main__.CustomError: An error occurred
Qui abbiamo creato un'eccezione definita dall'utente chiamata CustomError
che eredita dalla Exception
classe. Questa nuova eccezione, come altre eccezioni, può essere sollevata utilizzando l' raise
istruzione con un messaggio di errore opzionale.
Quando sviluppiamo un programma Python di grandi dimensioni, è buona norma inserire tutte le eccezioni definite dall'utente che il nostro programma solleva in un file separato. Molti moduli standard lo fanno. Definiscono le loro eccezioni separatamente come exceptions.py
o errors.py
(generalmente ma non sempre).
La classe di eccezione definita dall'utente può implementare tutto ciò che una classe normale può fare, ma generalmente le rendiamo semplici e concise. La maggior parte delle implementazioni dichiara una classe base personalizzata e deriva altre classi di eccezione da questa classe base. Questo concetto è reso più chiaro nel seguente esempio.
Esempio: eccezione definita dall'utente in Python
In questo esempio, illustreremo come le eccezioni definite dall'utente possono essere utilizzate in un programma per generare e rilevare gli errori.
Questo programma chiederà all'utente di inserire un numero finché non indovina correttamente un numero memorizzato. Per aiutarli a capirlo, viene fornito un suggerimento se la loro ipotesi è maggiore o minore del numero memorizzato.
# define Python user-defined exceptions class Error(Exception): """Base class for other exceptions""" pass class ValueTooSmallError(Error): """Raised when the input value is too small""" pass class ValueTooLargeError(Error): """Raised when the input value is too large""" pass # you need to guess this number number = 10 # user guesses a number until he/she gets it right while True: try: i_num = int(input("Enter a number: ")) if i_num number: raise ValueTooLargeError break except ValueTooSmallError: print("This value is too small, try again!") print() except ValueTooLargeError: print("This value is too large, try again!") print() print("Congratulations! You guessed it correctly.")
Ecco un esempio di esecuzione di questo programma.
Inserisci un numero: 12 Questo valore è troppo grande, riprova! Inserisci un numero: 0 Questo valore è troppo piccolo, riprova! Inserisci un numero: 8 Questo valore è troppo piccolo, riprova! Immettere un numero: 10 Congratulazioni! Hai indovinato correttamente.
Abbiamo definito una classe base chiamata Error
.
Le altre due eccezioni ( ValueTooSmallError
e ValueTooLargeError
) che vengono effettivamente sollevate dal nostro programma derivano da questa classe. Questo è il modo standard per definire le eccezioni definite dall'utente nella programmazione Python, ma non sei limitato solo a questo modo.
Personalizzazione delle classi di eccezione
Possiamo personalizzare ulteriormente questa classe per accettare altri argomenti secondo le nostre esigenze.
Per apprendere come personalizzare le classi di eccezione, è necessario disporre delle conoscenze di base della programmazione orientata agli oggetti.
Visita Python Object Oriented Programming per iniziare a conoscere la programmazione orientata agli oggetti in Python.
Diamo un'occhiata a un esempio:
class SalaryNotInRangeError(Exception): """Exception raised for errors in the input salary. Attributes: salary -- input salary which caused the error message -- explanation of the error """ def __init__(self, salary, message="Salary is not in (5000, 15000) range"): self.salary = salary self.message = message super().__init__(self.message) salary = int(input("Enter salary amount: ")) if not 5000 < salary < 15000: raise SalaryNotInRangeError(salary)
Produzione
Immettere l'importo dello stipendio: 2000 Traceback (ultima chiamata più recente): File "", riga 17, in aumento SalaryNotInRangeError (stipendio) __main __. SalaryNotInRangeError: Lo stipendio non è compreso nell'intervallo (5000, 15000)
Qui, abbiamo sovrascritto il costruttore della Exception
classe per accettare i nostri argomenti personalizzati salary
e message
. Quindi, il costruttore della Exception
classe genitore viene chiamato manualmente con l' self.message
argomento using super()
.
L' self.salary
attributo personalizzato è definito per essere utilizzato in seguito.
Il __str__
metodo ereditato della Exception
classe viene quindi utilizzato per visualizzare il messaggio corrispondente quando SalaryNotInRangeError
viene sollevato.
Possiamo anche personalizzare il __str__
metodo stesso sovrascrivendolo.
class SalaryNotInRangeError(Exception): """Exception raised for errors in the input salary. Attributes: salary -- input salary which caused the error message -- explanation of the error """ def __init__(self, salary, message="Salary is not in (5000, 15000) range"): self.salary = salary self.message = message super().__init__(self.message) def __str__(self): return f'(self.salary) -> (self.message)' salary = int(input("Enter salary amount: ")) if not 5000 < salary < 15000: raise SalaryNotInRangeError(salary)
Produzione
Immettere l'importo dello stipendio: 2000 Traceback (ultima chiamata più recente): File "/home/bsoyuj/Desktop/Untitled-1.py", riga 20, in aumento SalaryNotInRangeError (stipendio) __main __. SalaryNotInRangeError: 2000 -> Lo stipendio non è in ( 5000, 15000)
Per saperne di più su come gestire le eccezioni in Python, visita Python Exception Handling.