Come definire le eccezioni personalizzate in Python? (Con esempi)

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 Exceptionclasse 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 CustomErrorche eredita dalla Exceptionclasse. Questa nuova eccezione, come altre eccezioni, può essere sollevata utilizzando l' raiseistruzione 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.pyo 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 ( ValueTooSmallErrore 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 Exceptionclasse per accettare i nostri argomenti personalizzati salarye message. Quindi, il costruttore della Exceptionclasse genitore viene chiamato manualmente con l' self.messageargomento using super().

L' self.salaryattributo personalizzato è definito per essere utilizzato in seguito.

Il __str__metodo ereditato della Exceptionclasse viene quindi utilizzato per visualizzare il messaggio corrispondente quando SalaryNotInRangeErrorviene 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.

Articoli interessanti...