Не допускается отлов классов, которые не наследуются от BaseException

Я делаю пользовательский плагин для запроса базы данных для получения информации о пользователе для поддержки клиентов. Мой бэкэнд слабый.

Каждый раз, когда я запускаю команду бота, меня приветствуют:

Computer says nooo. See logs for details:
catching classes that do not inherit from BaseException is not allowed

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

Для отладки я попытался:

try:
    do_the_thing()
except (TypeError, ValueError) as e:
    return('Something went wrong.')

Я также попробовал:

try:
    do_the_thing()
except Exception as e:
    return('Something went wrong.')

И я все еще получаю предупреждение errbot. Обратите внимание, что команда все еще выполняется и делает все правильно, когда нет никаких исключений, вызванных do_the_thing().

1 ответ

Это означает, что:

  1. Где-то в вашем коде у вас есть except ... заявление, где исключение ... (или одно из исключений в последовательности ...) не является подклассом BaseException, а также
  2. Исключение бросается, который пойман этим except ... заявление.

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

Интерпретатор Python должен дать вам полный отслеживание исключения; первое, что вам нужно сделать, это найти это. Это может произойти в одной из двух ситуаций. (Это для однопоточных программ; я предполагаю, что ваша программа не многопоточная.)

  1. Во время выполнения вашей программы, в этом случае программа будет прервана исключением, или
  2. При доработке объектов (в их __del__(self) функции), в этом случае ошибка будет напечатана в stderr.

В обоих случаях должна быть трассировка стека, а не просто сообщение об ошибке; Я подтвердил, что по крайней мере на Python ≥3.4 трассировка стека распечатывается для случая 2.

Затем вам нужно следовать этой трассировке стека, чтобы увидеть, в чем проблема. Помните, что имена, которые вы даете except ... переменные (даже такие вещи, как TypeError), который можно переназначить, чтобы вы могли иметь дело с (извращенной) ситуацией, такой как:

TypeError = False
try:
    ...
except TypeError:
    ...

Но, скорее всего, это будет нечто очевидное, например:

class MyException:    # Doesn't inherit from Exception
    ...
try:
    ...
except MyException:
    ...

Есть один особый случай, о котором вам нужно знать: если вы видите сообщения для stderr (случай "2. Во время финализации" выше), распечатанные при выходе из программы, это означает, что исключение было сгенерировано во время очистки, когда интерпретатор завершает работу. где случайные величины по всей программе, возможно, уже были установлены в None как часть процесса очистки. Но в этом случае ваша программа все равно должна успешно завершиться.

Другие вопросы по тегам