Ho letto molte domande e articoli sulla gestione delle eccezioni in Python (e in generale), ma continuo a pensare che sia la cosa più confusa di sempre. Ho finito per fare qualcosa del genere:
# error class for exceptions specific to this script
class MyError(Exception): pass
# error class for exceptions in MyClass,
# which can be used from outside of this script
class MyClassError(Exception): pass
class MyClass:
...
# class has method that takes a function as a parameter
def method(self, param_function):
...
param_function(a, b, c, d)
try:
some_other_funtion(arg)
except ValueError, e:
raise MyClassError("Some message")
...
# outside of MyClass
if __name__ == "__main__":
# read input from console etc.
# ...
def function(a, b, c, d):
# ....
try:
# something with a
except ValueError, e:
raise MyError("My message:" + a)
try:
# something with b
except ValueError, e:
raise MyError("My message:" + b)
try:
# something with c
except ValueError, e:
raise MyError("My message:" + c)
try:
# something with d
except ValueError, e:
raise My Error("My slightly different message:" + d)
x = MyClass()
try:
x.method(function)
except (IOError, MyError, MyClassError) as e:
print e
Spiegazione:
Voglio che l'utente dello script ottenga solo un messaggio user-friendly se l'errore è il risultato del fatto che sta trasmettendo l'input sbagliato.
I messaggi con cui sollevo le mie eccezioni personalizzate sono user-friendly e (a mio parere) contengono tutte le informazioni che voglio che l'utente veda.
Questo è anche il motivo per cui sto gestendo IOError in modo simile. Mi aspetto un IOError solo se l'utente fornisce un nome file errato e voglio che venga visualizzato qualcosa come "File non trovato: nome del file" e niente altro.
Perché questo sembra sbagliato:
Nella mia funzione principale, in function
, fondamentalmente sto circondando ogni riga di codice con un try-catch e gestisco ogni eccezione in modo simile - a volte il messaggio che l'utente dovrebbe vedere è un po 'diverso, ma principalmente l'unica differenza è il parametro nel messaggio.
Domande:
Sto gestendo le mie eccezioni nei posti giusti?
Sto gestendoli nel modo giusto?
La duplicazione del codice che sto facendo in function
è necessaria?