Se si guarda il numero documentation for the built-in errors, si noterà che la maggior parte delle classi Exception
assegna il primo argomento come attributo message
. Non tutti però lo fanno.
particolare, EnvironmentError
(con sottoclassi IOError
e OSError
) ha un primo parametro di errno
, secondo di strerror
. Non c'è message
... strerror
è approssimativamente analogo a quello che normalmente sarebbe un message
.
Più in generale, le sottoclassi di Exception
possono fare tutto ciò che vogliono. Possono o non possono avere un attributo message
. Il futuro built-in Exception
s potrebbe non avere un attributo message
. Qualsiasi sottoclasse Exception
importata da librerie di terze parti o codice utente potrebbe non avere un attributo message
.
Penso che il modo corretto di gestirlo sia identificare le sottoclassi specifiche di Exception
che si desidera catturare, quindi catturare solo quelle invece di tutto con un except Exception
, quindi utilizzare qualsiasi attributo definito da tale sottoclasse.
Se si deve print
qualcosa, penso che la stampa della stessa catturato Exception
è più probabile che a fare ciò che si vuole, se ha un attributo message
o meno.
Si potrebbe anche verificare per l'attributo messaggio se si voleva, in questo modo, ma non sarebbe davvero suggerire come sembra solo disordinato:
try:
pass
except Exception as e:
# Just print(e) is cleaner and more likely what you want,
# but if you insist on printing message specifically whenever possible...
if hasattr(e, 'message'):
print(e.message)
else:
print(e)
Stai confondendo due cose diverse - 'eccetto Foo as bar:' è lo stesso di 'tranne Foo, bar:' (eccetto il primo è più recente, e continuerà a funzionare in 3.x), sia che l'errore venga fornito con un attributo 'message' o non è separato. – jonrsharpe
@jonrsharpe Modificato – FrozenHeart
@FrozenHeart Stai chiedendo se l'accesso a '.message' per un errore è standard o no? –