Python и исключения - PullRequest
4 голосов
/ 08 июня 2011

Исходя из фона Java, мне нравится, когда меня предупреждают, что я не ловлю исключение, не читая документацию. И если я прочитал документацию о методе, выброшенное исключение было показано прямо в сигнатуре метода документации.

В Python мне приходится часто читать текстовый абзац в документации, чтобы найти одно предложение, в котором будет указано, какое исключение будет выдано.

Кроме того, сегодня я использовал стороннюю библиотеку в Python, http://packages.python.org/kombu/reference/kombu.connection.html, и это меня бесит. Нет стандартного формата документации? Я использовал метод канала (http://packages.python.org/kombu/reference/kombu.connection.html#kombu.connection.BrokerConnection.channel), и он даже не заявляет, что выдает исключение. Я должен был найти это методом проб и ошибок.

Я упускаю здесь что-то очевидное или исключения рассматриваются как запоздалая мысль в Python и его документации.

Ответы [ 5 ]

14 голосов
/ 08 июня 2011

Мы любим исключения.Они довольно важная языковая особенность.В хорошей документации обычно указывается, какие исключения будут создаваться в каких случаях, и лично я обнаружил, что большинство документов в этом отношении хороши.Конечно, всегда есть некоторый процент документации, которая не годится.В любом случае, если вы ищете явный автономный список для каждой функции, вам не повезло.Никто не знает этого, кроме программистов, работающих над кодом.

Чтение абзаца не кажется мне слишком плохим, тем более что информация об этом абзаце обычно так или иначе важна.И еще есть <Ctrl+F>raises<Enter> ...

Нет стандартного формата документации?

Есть Sphinx, который используется во многих проектах (включая docs.python.org, так что выэто уже известно, а также включая проект, на который вы ссылались, хотя он использует другой оптический стиль).Конечно, никто не может заставить каждый проект использовать его, как вы не можете заставить их использовать стандартный стиль кодирования.Но, честно говоря, я думаю, что все проекты, которые я использовал до сих пор, кроме двух (PyGame и LEPL), использовали Sphinx.Это может быть связано с тем, что мне приходится использовать относительно немного благодаря обширной стандартной библиотеке, но все же.

Мне нравится, когда меня предупреждают, что я не ловлю исключение

Почему?По дикой догадке, 60% исключений получают новички, потому что они неправильно написали код, а не из-за какого-то исключительного состояния окружающей среды, которое необходимо обработать.Например, TypeError и ImportError просто не встречаются в хорошо написанной безошибочной программе (кроме метапрограммирования и разделов, для которых требуется крайняя динамичность).

В общемЕсли вы хотите, чтобы компилятор рассказал вам о вашем коде, который вы еще не знали, вы используете не тот язык.Python динамический, вы тестируете вместо статического анализа.Смирись с этим.

6 голосов
/ 08 июня 2011

Брюс Экель обсуждает Проверенные исключения Java против исключений Python в длину. Ключевая цитата:

Когда я начал использовать Python, все появились исключения, ни одно не было случайно "исчез". если ты хотите поймать исключение, вы можете, но вы не обязаны писать группы кода все время, чтобы быть передавая исключения вокруг. Они идут до того места, где вы хотите их поймать, или они идут до конца, если вы забудете (и, таким образом, они напоминают вам), но они не исчезайте, что является худшим из все возможные случаи. Теперь я верю, что проверенные исключения побуждают людей заставить их исчезнуть. Плюс они делают много менее читаемый код.

Стоит прочитать всю статью.

Относительно документации. Я говорю, что да, какая-то документация плохая.

5 голосов
/ 08 июня 2011

Python не предъявляет те же требования для объявления исключений, что и Java.Большинство языков этого не делают.В связи с этим Java часто генерирует исключения, которые не объявляются сразу (NullPointerException кто-нибудь?).Вежливо документировать исключения на всех языках, но в мире, где мы даже не можем гарантировать, что публичный метод будет вообще документирован, это действительно удивительно?

Глядя на библиотеку, которую вы 'При использовании кажется, что вам нужно создать экземпляр объекта Transport (вещь, которая действительно вызвала исключение), имеет список исключений, которые выдается.Это реальный объект, генерирующий исключения, а не BrokerConnection.

Знаете ли вы о модуле traceback ?Это может помочь вам отследить эти проблемы в будущем.

0 голосов
/ 08 июня 2011

Хотя я не могу поручиться за ваш опыт работы со сторонней библиотекой, на которую вы ссылались, я бы сказал, что по крайней мере ожидается документация об Исключениях.Возьмите встроенный smtplib , например.Объясняются исключения, которые могут быть сгенерированы, и методы включают в себя информацию о том, какие из них они сгенерируют и почему.

До того, как заранее знать, какие исключения могут быть сгенерированы, если вы не в аккаунтенапример, в IDE вы можете найти некоторый самоанализ кода, который даст вам то, что вы ищете.

По моему опыту, исключения - это то, что вы знаете заранее, потому что вы 'у вас есть неконтролируемые условия установки (работа с пользовательским вводом и т. д.) или вы используете методы, которые инкапсулируют поведение таким образом, чтобы исключить их.Например, в Python, если вы работали с объектом, у которого должен иметь заданный атрибут, но вы не уверены, что вы можете гарантировать, что у будет этот атрибут вместоДелая вызов Object.method(), вы делаете это вместо этого:

# getattr uses the arguments (object, 'attribute', default)
toCall = getattr(MyInstance, 'methodName', None)

if toCall is not None:
  toCall(args)

# or if you prefer
if toCall is None:
  myDialogClass.NotifyUser('Object does not contain necessary method.')

При работе с коллекциями, такими как словари, это еще проще:

nums = dict((i, i) for i in range(30))

# Here the .get() method takes the form (key, default)
# No such thing as a KeyError 
nums.get('50', None)

Так, обычно, когда вы обсуждаете программирование на Python,Идея не в том, что вам нужно убедиться, что каждое исключение учтено.Наоборот.Учтите те, которые вы должны, но программируйте, используя идиомы, которые сводят к минимуму количество из них, с которыми вам приходится иметь дело.

0 голосов
/ 08 июня 2011

Я думаю, что это вопрос перспективы.Система Java имеет свои недостатки.Например, большую часть времени в Java я обнаружил, что просто пишу printStackTrace.Иногда мне нужно было сделать что-то более сложное.Например, система должна была печатать сообщения об ошибках для пользователя, который был подключен через telnet.Опять же, было огромное количество шаблонов.

Вот почему мне понравилось, что в python есть способ дать вам возможность определить единственную функцию для перехвата всех необработанных исключений: sys.excepthook.Конечно, это связано с собственным набором проблем, но мне нравится, что функциональность есть, если она мне нужна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...