Я хотел создать свой собственный класс исключений 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?






Вы должны вызвать метод базового класса с экземпляром в качестве первого аргумента:
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 ...
Вот почему я предпочитаю использовать super (), а не явно вызывать метод в этом. Если вы забудете аргумент self для super (), вы сразу получите ошибку.
В Python 3 super() больше не требует аргументов.
хмель все правильно.
В качестве побочного примечания вам действительно не следует создавать подклассы BaseException, вместо этого вы должны создавать подклассы Exception. (Если вы действительно не знаете, что делаете)
Спасибо. Это не первый раз, когда я где-то забываю использовать «я»; Я уверен, что это не будет последним.