Подтвердить что ты не робот

Избегание предупреждения "Слишком широкое исключение" в PyCharm

Я пишу предложение исключения на верхнем уровне script, и я просто хочу, чтобы он регистрировал все ошибки. Раздражающе, PyCharm жалуется, если я просто поймаю Exception.

import logging

logging.basicConfig()

try:
    raise RuntimeError('Bad stuff happened.')
except Exception:  # <= causes warning: Too broad exception clause
    logging.error('Failed.', exc_info=True)

Что-то не так с этим обработчиком? Если нет, как я могу сказать PyCharm, чтобы заткнуться?

4b9b3361

Ответ 1

Из комментария Джорана: вы можете использовать # noinspection PyBroadException, чтобы сообщить PyCharm, что вы в порядке с этим предложением об исключении. Это то, что я искал изначально, но я упустил возможность подавить проверку в меню предложений.

import logging

logging.basicConfig()

# noinspection PyBroadException
try:
    raise RuntimeError('Bad stuff happened.')
except Exception:
    logging.error('Failed.', exc_info=True)

Если вы даже не хотите регистрировать исключение и хотите просто подавить его без жалоб PyCharm, в Python 3.4 появилась новая функция: contextlib.suppress().

import contextlib

with contextlib.suppress(Exception):
    raise RuntimeError('Bad stuff happened.')

Это эквивалентно этому:

try:
    raise RuntimeError('Bad stuff happened.')
except Exception:
    pass

Ответ 2

Я нашел подсказку в этом закрытом для PyCharm:

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

Поскольку я регистрируюсь с помощью exc_info=True, я неявно использую текущий объект исключения, но PyCharm этого не знает. Чтобы сделать это явным, я могу сделать что-то немного взломанное: exc_info может использовать любое правдивое значение для включения трассировки стека в журнал. Объект исключения должен быть правдивым, потому что это не None.

import logging

logging.basicConfig()

try:
    raise RuntimeError('Bad stuff happened.')
except Exception as e:
    logging.error('Failed.', exc_info=e)

Ответ 3

Не уверен насчет вашей версии PyCharm (у меня 2019.2), но я настоятельно рекомендую отключить эту проверку PyCharm в "Файл"> "Настройки"> "Редактор"> "Проверки" и ввести "слишком широкий". На вкладке Python отмените выбор "слишком широких исключений", чтобы избежать их. Я считаю, что таким образом PyCharm покажет вам правильную проверку выражения

Ответ 4

Я не хочу отключать предупреждения в принципе.

В представленном случае вы хорошо знаете, что такое исключение. Лучше всего быть конкретным. Например:

try:
    raise RuntimeError("Oops")
except RuntimeError as e:
    print(e, "was handled")

выдаст "Упс был обработан".

Если есть несколько возможных исключений, вы можете использовать два, кроме предложений. Если может быть множество возможных исключений, следует ли пытаться использовать один блок try для обработки всего? Может быть, лучше пересмотреть дизайн!