Исключение ошибки должно происходить из 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 !")