Предупреждение pylint для 'except Exception:'
Для блока вроде этого:
try:
#some stuff
except Exception:
pass
pylint вызывает предупреждение W0703 "Catch" Exception ". Почему?
Ответы
Ответ 1
Считалось, что хорошая практика обычно не ловить корневой объект Exception, а вместо этого ловить более конкретные - например, IOException.
Считайте, произошло ли исключение из памяти - просто использование "pass" не оставляет вашу программу в хорошем состоянии.
В значительной степени единственный раз, когда вы должны поймать Исключение, находится на верхнем уровне вашей программы, где вы можете (попытаться) зарегистрировать его, отобразить ошибку и выйти так же изящно, как вы можете.
Ответ 2
Хорошая практика - поймать только очень узкий диапазон типов. "Исключение" слишком общее - вы в конечном итоге поймаете не только ошибки, которые вы планировали, но и другие ошибки, которые могут маскировать ошибки в вашем коде, которые будут быстрее диагностировать, если они вообще не были пойманы, или, возможно, лучше справиться с одним обработчиком исключений высокого уровня.
Сказав это, поскольку Python2.6, catching Exception стал намного более разумным, потому что все исключения, которые вы не хотели бы ловить (SystemExit, KeyboardInterrupt), больше не наследуются от Exception. Вместо этого они вместо этого наследуют от общего BaseException. Это было сделано намеренно, чтобы сделать исключение для ловли относительно безвредным, поскольку это такая распространенная идиома.
Подробнее см. PEP 3110, чтобы узнать подробности и планы на будущее.
Ответ 3
потому что он думает, что вы слишком много ловите. и это правильно.
Ответ 4
Исключение возникают, когда происходит что-то... исключительное. Как правило, хорошо, что программа завершается.
Возможно, вы захотите проигнорировать некоторые исключения, но у IMO нет веских оснований для поиска базового класса.
Ответ 5
как ответ Грега, "Исключение" - это базовый класс, и исключения должны быть получены из этого класса, см. также exceptions.Exception.
Здесь очень полезный список ошибок в pydocs
Обратите внимание также на очень удобный модуль трассировки, который позволяет узнать, где произошло исключение. Использование только "except:..." покажет вам, какую ошибку вы должны наилучшим образом использовать в своем случае. Например, попробуйте этот код (переключите комментарий), возможно, вы его примете:
import traceback
#absent = 'nothing'
try:
something = absent
except NameError:
traceback.print_exc()
else:
print("you get here only when you uncomment 'absent'")
Ответ 6
Catching Exception (без повторного рейза) имеет 2 очень плохих побочных эффекта: ошибки съедают, поэтому вы теряете трассировку стека, а также то, что ctrl-c (или что-то вроде ключа разрыва в вашей операционной системе) также обрабатывается здесь.
Типичным поведением таких программ является то, что либо они не могут быть остановлены, либо что ctrl-c заставляет поток управления пропустить вперед (обработчику исключений), а затем продолжить. Тогда либо код не может быть прерван, либо вам нужно забить ctrl-c, чтобы остановить его.