Исключение ошибки должно происходить из BaseException, даже когда оно происходит (Python 2.7)

Что не так со следующим кодом (под Python 2.7.1):

class TestFailed(BaseException):
    def __new__(self, m):
        self.message = m
    def __str__(self):
        return self.message

try:
    raise TestFailed('Oops')
except TestFailed as x:
    print x

Когда я запускаю его, я получаю:

Traceback (most recent call last):
  File "x.py", line 9, in <module>
    raise TestFailed('Oops')
TypeError: exceptions must be old-style classes or derived from BaseException, not NoneType

Но мне кажется, что TestFailed действительно происходит от BaseException,

5 ответов

Решение

__new__ - это статический метод, который должен возвращать экземпляр.

Вместо этого используйте метод __init__:

>>> class TestFailed(Exception):
    def __init__(self, m):
        self.message = m
    def __str__(self):
        return self.message

>>> try:
    raise TestFailed('Oops')
except TestFailed as x:
    print x


Oops

Другие показали вам, как исправить вашу реализацию, но я считаю важным отметить, что поведение, которое вы реализуете, уже является стандартным поведением исключений в Python, поэтому большая часть вашего кода совершенно не нужна. Просто производное от Exception (соответствующий базовый класс для исключений во время выполнения) и положить pass как тело.

class TestFailed(Exception):
    pass

Использование __init__() вместо __new__() "инициализировать" классы. В большинстве случаев переопределение __new__ не обязательно. Называется раньше __init__ во время создания объекта.

Смотрите также использование Python __new__ и __init__?

__new__ реализация должна возвращать экземпляр класса, но в настоящее время она возвращает None (по умолчанию).

Тем не менее, похоже, что вы должны использовать __init__ здесь, а не __new__,

попробуй это:

      try:
    do something ...

except AttributeError:
        raise AttributeError("Please select the right frame from dropdown !")
Другие вопросы по тегам