Zwykle wolę obsługiwać wyjątki wewnętrznie (tj. Try / except wewnątrz wywoływanej funkcji, prawdopodobnie zwracając None), ponieważ python jest wpisywany dynamicznie. Ogólnie uważam to za wezwanie do oceny w taki czy inny sposób, ale w dynamicznie wpisywanym języku istnieją małe czynniki, które przechylają szalę na korzyść nieprzekazywania wyjątku dzwoniącemu:
- Nikt, kto wywołuje twoją funkcję, nie jest powiadamiany o wyjątkach, które mogą zostać wyrzucone. Staje się trochę formą sztuki, aby wiedzieć, jakiego rodzaju wyjątek szukasz (i należy unikać ogólnych z wyjątkiem bloków).
if val is Nonejest trochę łatwiejsze niż except ComplicatedCustomExceptionThatHadToBeImportedFromSomeNameSpace. Poważnie, nienawidzę konieczności pamiętania o wpisywaniu from django.core.exceptions import ObjectDoesNotExistna górze wszystkich moich plików django tylko po to, aby obsłużyć naprawdę powszechny przypadek użycia. W świecie wpisywanym statycznie, pozwól edytorowi zrobić to za Ciebie.
Szczerze mówiąc, zawsze jest to wezwanie do oceny, a sytuacja, którą opisujesz, w której wywoływana funkcja otrzymuje błąd, którego nie może pomóc, jest doskonałym powodem do ponownego zgłoszenia wyjątku, który ma znaczenie. Masz dokładny właściwy pomysł, ale chyba, że jesteś wyjątkiem, dostarczysz bardziej znaczących informacji w śladzie stosu niż
AttributeError: 'NoneType' object has no attribute 'foo'
co dziewięć razy na dziesięć zobaczy dzwoniący, jeśli zwrócisz nieobsłużone Brak, nie przejmuj się.
(Wszystko to sprawia, że chciałbym, aby wyjątki w Pythonie miały causedomyślnie atrybuty, tak jak w java, co pozwala przekazywać wyjątki do nowych wyjątków, aby można było wrzucić wszystko, co chcesz, i nigdy nie stracić pierwotnego źródła problemu).