Зазвичай я вважаю за краще обробляти винятки внутрішньо (тобто спробувати / за винятком всередині викликаної функції, можливо, повертаючи None), оскільки python динамічно набирається. Загалом, я вважаю це викликом судження так чи інакше, але в мові, що динамічно набирається, є невеликі фактори, які нахиляють терези на користь не передачі винятку абоненту:
- Будь-хто, хто викликає вашу функцію, не повідомляється про винятки, які можуть виникнути. Це стає трохи формою мистецтва, щоб знати, на який виняток ви шукаєте (і загального, окрім блоків, яких слід уникати).
if val is None
трохи легше ніж except ComplicatedCustomExceptionThatHadToBeImportedFromSomeNameSpace
. Серйозно, я ненавиджу, щоб не забувати друкувати from django.core.exceptions import ObjectDoesNotExist
вгорі всіх моїх файлів django, щоб просто обробити справді поширений випадок використання. У статично набраному світі нехай редактор зробить це за вас.
Чесно кажучи, однак, це завжди виклик судження, і ситуація, яку ви описуєте, коли викликана функція отримує помилку, яка не може допомогти, є чудовим приводом повторно викликати виняток, який має значення. У вас є точна правильна ідея, але якщо ви не виняток, ви надасте більш значущу інформацію у трасі стека, ніж
AttributeError: 'NoneType' object has no attribute 'foo'
що, дев'ять разів із десяти, те, що абонент побачить, якщо ви повернете не оброблений Ні, не турбуйтеся.
(Все це змушує мене бажати, щоб винятки python мали cause
атрибути за замовчуванням, як у java, що дозволяє передавати винятки в нові винятки, щоб ви могли відновити все, що хочете, і ніколи не втратити першоджерело проблеми.)