Ответ 1
В общем, вам следует "поймать" исключения, которые вы ожидаете (потому что они могут быть вызваны ошибкой пользователя или другими проблемами окружающей среды вне вашего контроля над программой), особенно если вы знаете, что ваш код может о них. Просто предоставление более подробной информации в отчете об ошибках является краевой проблемой, хотя для некоторых программ может потребоваться выполнение таких задач (например, долгосрочный сервер, который не должен вылетать из-за таких проблем, а скорее записывать много информации о состоянии, предоставлять пользователь краткое объяснение и просто продолжайте работать для будущих запросов).
NameError
, TypeError
, KeyError
, ValueError
, SyntaxError
, AttributeError
и т.д. можно рассматривать как из-за ошибок в программе - ошибок, а не проблем за пределами контроль программиста. Если вы выпускаете библиотеку или фреймворк, так что ваш код будет вызываться другим кодом вне вашего контроля, то такие ошибки могут, скорее всего, быть в этом другом коде; вы должны, как правило, разрешать распространение распространения, чтобы помочь другому программисту отладить собственные ошибки. Если вы выпускаете приложение, у вас есть ошибки, и вы должны выбрать стратегию, которая поможет вам найти их.
Если ваши ошибки появляются, когда конечный пользователь запускает программу, вы должны регистрировать много информации о состоянии и давать пользователю краткое объяснение и извинения (возможно, с просьбой отправить вам информацию о журнале, если вы не может автоматизировать это - или, по крайней мере, спросить разрешения, прежде чем отправлять что-либо с пользовательской машины на ваш). Вы можете сохранить часть работы пользователя до сих пор, но часто (в программе, которая, как известно, является ошибкой), которая может не работать в любом случае.
Большинство ошибок должны появляться во время вашего собственного тестирования; в этом случае распространение исключения полезно, поскольку вы можете подключить его к отладчику и изучить подробности об ошибках.
Иногда такие исключения появляются только потому, что "проще просить прощения, чем разрешение" (EAFP) - совершенно приемлемый метод программирования в Python. В этом случае, конечно, вы должны обращаться с ними сразу. Например:
try:
return mylist[theindex]
except IndexError:
return None
здесь вы можете ожидать, что theindex
обычно является допустимым индексом в mylist
, но иногда вне границ mylist
, а последний случай - по семантике гипотетического приложения, в котором этот фрагмент принадлежит, - это а не ошибка, лишь небольшая аномалия должна быть исправлена, рассматривая список, который будет концептуально расширен с обеих сторон с бесконечным числом None
s. Легче просто попробовать/исключить, чем правильно проверить положительные и отрицательные значения индекса (и быстрее, если выходить за пределы - это действительно редкое явление).
Аналогично подходящие случаи для KeyError
и AttributeError
случаются реже, благодаря встроенному методу getattr
builtin и get
dicts (который позволяет указать значение по умолчанию), collections.defaultdict
и т.д.; но списки не имеют прямого эквивалента, поэтому функция try/except чаще просматривается для IndexError
.
Попытка уловить ошибки синтаксиса, ошибки типа, ошибки значений, ошибки имен и т.д., немного реже и более противоречиво - хотя было бы разумно, если бы ошибка была диагностирована в "подключаемом модуле", который ваш фреймворк/приложение пытается загрузить и выполнить динамически (действительно, в том случае, когда вы поставляете библиотеку или тому подобное, и вам необходимо мирно сосуществовать с кодом из вашего контроля, который может быть ошибочным). Ошибки типа и значения могут иногда возникать в шаблоне EAFP - например, когда вы пытаетесь перегрузить функцию, чтобы принять строку или число и вести себя несколько иначе в каждом случае, ловить такие ошибки может быть лучше, чем пытаться проверять типы, - но сама концепция функций, таким образом перегруженная, чаще всего сомнительна.
Возвращаясь к "пользовательским и экологическим ошибкам", пользователи неизбежно совершают ошибки, когда они дают вам ввод, указывают имя файла, который фактически не существует (или у вас нет разрешения на чтение, или писать, если это то, предполагается, что они делают) и т.д.: все такие ошибки следует, конечно же, поймать и дать четкое объяснение пользователю о том, что пошло не так, и еще один шанс получить право ввода. Сети где-то снижаются, базы данных или другие внешние серверы могут не реагировать так, как ожидалось, и т.д. - иногда это стоит ловить такие проблемы и повторять (возможно, после небольшого ожидания - возможно, с указанием пользователю о том, что неправильно, например, возможно, случайно отсоединили кабель, и вы хотите дать им возможность исправить ситуацию и сказать вам, когда попробовать еще раз), иногда (особенно в автоматических долгосрочных программах) вы ничего не можете сделать, кроме заказанного отключения (и подробного ведения журнала каждого возможного аспекта окружающей среды).
Итак, вкратце, ответ на ваш вопрос Q: "Это зависит";-). Надеюсь, что мне было полезно перечислять многие ситуации и аспекты, от которых оно может зависеть, и рекомендовать, что в целом самое полезное отношение к этим вопросам.