Проблема подкласса BaseException в Python

Я хотел создать свой собственный класс исключений Python, например:

class MyException(BaseException):
    def __init__(self, errno, address):
        if errno == 10048:
            mess = str(address) + ' is already in use'
        else:
            mess = 'Unable to open ' + str(address)
        BaseException.__init__(mess)

но когда программа дошла до вызова BaseException.__init__(), я получил следующую трассировку:

BaseException.__init__(mess)
TypeError: descriptor '__init__' requires a 'exceptions.BaseException' object but received a 'str'

Я думал, что BaseException примет любой набор аргументов. Кроме того, как я должен передать объект «exceptions.BaseException» в конструктор exceptions.BaseException?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
6
0
4 835
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы должны вызвать метод базового класса с экземпляром в качестве первого аргумента:

BaseException.__init__(self, mess)

Цитата из руководство:

An overriding method in a derived class may in fact want to extend rather than simply replace the base class method of the same name. There is a simple way to call the base class method directly: just call BaseClassName.methodname(self, arguments). This is occasionally useful to clients as well. (Note that this only works if the base class is defined or imported directly in the global scope.)

Как упоминал Тони Арклес и в документация,

All built-in, non-system-exiting exceptions are derived from this class. All user-defined exceptions should also be derived from [Exception].

так что вы все равно не должны наследовать от BaseException ...

Спасибо. Это не первый раз, когда я где-то забываю использовать «я»; Я уверен, что это не будет последним.

Charles Anderson 18.12.2008 20:14

Вот почему я предпочитаю использовать super (), а не явно вызывать метод в этом. Если вы забудете аргумент self для super (), вы сразу получите ошибку.

Matt Green 18.12.2008 20:16

В Python 3 super() больше не требует аргументов.

user3850 22.06.2017 16:23

хмель все правильно.

В качестве побочного примечания вам действительно не следует создавать подклассы BaseException, вместо этого вы должны создавать подклассы Exception. (Если вы действительно не знаете, что делаете)

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