Найти - Пользователи
Полная версия: обработка AttributeError
Начало » Центр помощи » обработка AttributeError
1
igor110
Доброе время суток. Подскажите пожалуйста изящное решение для обработки AttributeError, чтобы вместо него выскакивало своё исключение (MissmatchError). Идет специально вызов метода b , которого нет в классе, на который срабатывает AttributeError: ‘School’ object has no attribute ‘b’. Нужно заменить вывод на свой MissmatchError. Пробовал различные варианты с try-except, захватывая вплоть до всего кода, но всё равно не выходит. Заранее благодарю.
Имеется:

 class MismatchError(Exception):
pass
class School:
   list = [1,2,3]
   def __init__(self, name: str):
   self.name = name
   
def a(self, wizard):
   self.wizard = wizard




Stright
Как-то так:
 class MismatchError(Exception):
    pass
class School:
    list = [1, 2, 3]
    def __init__(self, name: str):
        self.name = name
    def a(self, wizard):
        self.wizard = wizard
if __name__ == '__main__':
    school = School('School')
    method = getattr(school, 'b', None)
    if method is None:
        raise MismatchError('Message')
    method()
Нельзя называть переменные ключевыми словами или встроенными типами (я про атрибут класса list).
Также нельзя присваивать атрибутам класса изменяемые типы данных. Вы присваиваете атрибуту класса список, это означет, что все экземпляры этого класса будут работать с одним и тем же объектом списка, и, если один экземпляр изменит его (добавит или удалит какие-либо элементы этого списка), то у других экземпляров уже будет изменненый список.
 class Test:
    lst = [1, 2, 3]
test1 = Test()
test1.lst.append(4)
print(test1.lst)
test2 = Test()
print(test2.lst)
igor110
Stright, спасибо за ответ.
в реале у меня список не list называется, это я для удобства тут обозначил. И да, в условии так и должно быть, что к этому листу можно обращаться не через объект, это переменная класса.
В одном из тестов идет вызов несуществующего метода класса, и в ответе - свой MissmatchError , а не AtributeError. Думал опечатка, а нет, так и хотят в условии. Сам код проходит тесты на правильные методы. но вот этот тест пока не могу пройти.
Rodegast
 >>> class MismatchError(Exception):
        pass
... 
>>> class School:
...     def __init__(self):
...         self.a = 1
...     def __getattr__(self, attr):
...         raise MismatchError("1111")
... 
>>> a = School()
>>> a.a
1
>>> a.b
Traceback (most recent call last):
  File "<input>", line 1, in <module>
    a.b
  File "<input>", line 5, in __getattr__
    raise MismatchError("1111")
MismatchError: 1111
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB