Зачем вам нужно выводить свое пользовательское исключение из BaseException?

#python #python-3.x

#python #python-3.x

Вопрос:

Каждый класс, который вы создаете в Python, неявно является производным от object . Чтобы создать новый класс ошибок, вы должны вывести его из BaseException или из одного из его дочерних классов (обычно Exception используется для этой цели). Это пользовательское исключение успешно пройдет isinstance(MyException, object) тест, поэтому оно по-прежнему является object . Но мне интересно, по какой причине это ограничение было реализовано? Почему нам нужно выводить из BaseException или его потомков вместо того, чтобы делать так:

 class MyException:
    pass


raise MyException()
 

Комментарии:

1. Вероятно, вам не нужно этого делать, но если вы этого не сделаете, вы должны убедиться, что все методы, для реализации которых требуются исключения, реализованы в вашем классе.

2. BaseException также является производным от object .

3. «Каждый класс, который вы создаете в Python, будет неявно производным от object . Исключением из этого правила являются классы, используемые для указания ошибок путем создания исключения. » Абсолютно неверно. * все в Python происходит из object . Что создало у вас впечатление иначе?

4. Вы явно, а не неявно выводите из них.

5. Как обсуждалось в разделе «В чем причина закрытия вопросов «почему» в языковом дизайне? чтобы быть в теме, вопрос должен касаться конкретной проблемы, с которой вы действительно сталкиваетесь. Если вы не сталкиваетесь с проблемой, вызванной языком, поощряющим исключения, производные от BaseException (и не знаете, как исправить эту проблему!), Это здесь не актуально.

Ответ №1:

raise для корректной работы требуется несколько специальных атрибутов уровня C (в частности, эти здесь).

Единственный способ получить их в свой объект на чистом python — это подкласс BaseException . Из-за этого разработчики python просто решили, что каждый вызываемый объект, даже если он определен в модуле C, должен наследоваться от BaseException , чтобы упростить проверки.