предупреждение Pylint на «кроме исключения:» - PullRequest
18 голосов
/ 16 апреля 2009

Для такого блока:

try:
    #some stuff
except Exception:
    pass

Пилинт выдает предупреждение W0703 «Поймать« Исключение »». Почему?

Ответы [ 6 ]

27 голосов
/ 16 апреля 2009

Хорошей практикой считается обычно не перехватывать корневой объект Exception, а вместо этого перехватывать более конкретные - например, IOException.

Рассмотрим, произошло ли исключение нехватки памяти - простое использование «pass» не приведет к тому, что ваша программа будет в хорошем состоянии.

Практически единственный раз, когда вы должны поймать Exception, находится на верхнем уровне вашей программы, где вы можете (попытаться) зарегистрировать его, отобразить ошибку и выйти так изящно, как можете.

17 голосов
/ 12 июля 2009

Полезно ловить только очень узкий диапазон типов. «Исключение» является слишком общим - вы в конечном итоге поймаете не только те ошибки, которые вы запланировали, но и другие ошибки, которые могут маскировать ошибки в вашем коде, которые будут быстрее диагностировать, если они вообще не были обнаружены или, возможно, Лучше иметь дело с одним обработчиком исключений очень высокого уровня.

Сказав, что начиная с Python2.6 перехват Exception стал намного более разумным, потому что все исключения, которые вы не хотите перехватывать (SystemExit, KeyboardInterrupt), больше не наследуются от Exception. Вместо этого они наследуют от общего BaseException. Это сделано специально для того, чтобы отлов Exception был относительно безвредным, поскольку это такая распространенная идиома.

См. PEP 3110 для подробностей и планов на будущее.

3 голосов
/ 16 апреля 2009

потому что думает, что вы слишком много ловите. и это правильно.

1 голос
/ 16 июля 2011

как и ответ Грега, «Исключение» является базовым классом, и исключения должны быть получены из этого класса, см. Также exceptions.Exception .

Здесь очень полезен список ошибок в pydocs

Обратите внимание также на очень удобный модуль трассировки, который позволяет вам выяснить, где произошло исключение. Использование только «кроме: ...» покажет вам, какую ошибку вам лучше всего использовать в вашем случае. Например, попробуйте этот код (переключить комментарий), возможно, вы примете его:

import traceback
#absent = 'nothing'
try:
    something = absent
except  NameError:
    traceback.print_exc()
else:
    print("you get here only when you uncomment 'absent'") 
1 голос
/ 16 апреля 2009

Исключения возникают, когда происходит что-то ... исключительное. Обычно хорошо, что программа завершается.

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

0 голосов
/ 03 мая 2009

Исключение Catching (без повторного повышения) имеет 2 действительно плохих побочных эффекта: ошибки сгорают, поэтому вы теряете трассировку стека, но также обрабатывается ctrl-c (или любой другой ключ прерывания в вашей операционной системе) здесь.

Типичное поведение программ, подобных этой, заключается в том, что либо они не могут быть остановлены, либо ctrl-c заставляет поток управления пропустить вперед (к обработчику исключений), а затем продолжить. Тогда или код не может быть прерван, или вам нужно нажать ctrl-c, чтобы остановить его.

...