предупреждение pylint о 'except Exception:'за исключением исключения:'

StackOverflow https://stackoverflow.com/questions/756180

  •  09-09-2019
  •  | 
  •  

Вопрос

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

try:
    #some stuff
except Exception:
    pass

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

Это было полезно?

Решение

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

Подумайте, не возникло ли исключение нехватки памяти - простое использование "pass" не приведет к тому, что ваша программа останется в хорошем состоянии.

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

Другие советы

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

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

Видишь ОПТОСОЗ 3110 для получения подробной информации и планов на будущее.

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

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

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

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

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

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

import traceback
#absent = 'nothing'
try:
    something = absent
except  NameError:
    traceback.print_exc()
else:
    print("you get here only when you uncomment 'absent'") 

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top