Di solito preferisco gestire le eccezioni internamente (cioè try / tranne all'interno della funzione chiamata, possibilmente restituendo None) perché python è tipizzato dinamicamente. In generale, lo considero una chiamata di giudizio in un modo o nell'altro, ma in un linguaggio digitato dinamicamente, ci sono piccoli fattori che fanno pendere la bilancia a favore di non passare l'eccezione al chiamante:
- Chiunque chiami la tua funzione non viene informato delle eccezioni che possono essere generate. Diventa un po 'una forma d'arte sapere che tipo di eccezione stai cercando (e dovrebbero essere evitati i blocchi generici eccetto).
if val is Noneè un po 'più facile di except ComplicatedCustomExceptionThatHadToBeImportedFromSomeNameSpace. Seriamente, odio dover ricordare di digitare from django.core.exceptions import ObjectDoesNotExistall'inizio di tutti i miei file django solo per gestire un caso d'uso molto comune. In un mondo digitato staticamente, lascia che sia l'editor a farlo per te.
Onestamente, però, è sempre una chiamata di giudizio, e la situazione che stai descrivendo, in cui la funzione chiamata riceve un errore che non può aiutare, è un ottimo motivo per rilanciare un'eccezione che è significativa. Hai esattamente l'idea giusta, ma a meno che tu non sia un'eccezione, fornirai informazioni più significative in una traccia dello stack rispetto a
AttributeError: 'NoneType' object has no attribute 'foo'
che, nove volte su dieci, è ciò che il chiamante vedrà se restituisci un Nessuno non gestito, non preoccuparti.
(Tutto questo mi fa desiderare che le eccezioni python avessero gli causeattributi di default, come in java, che ti consente di passare le eccezioni in nuove eccezioni in modo da poter lanciare nuovamente tutto ciò che desideri e non perdere mai la fonte originale del problema.)