Создание классов исключений в Python
В Python можно создавать собственные классы исключений. Они должны напрямую или опосредованно быть потомками класса Exception.
class MyError(Exception): def __init__(self, text): self.txt = text a = input("Input positive integer: ") try: a = int(a) if a < 0: raise MyError("You give negative!") except ValueError: print("Error type of value!") except MyError as mr: print(mr) else: print(a)
Пример выполнения:
Input positive integer: -10 You give negative!
В данном случае в выражении MyError("You give negative!") создается экземпляр собственного класса исключений. С помощью raise исключение возбуждается. В перехватившей его соответствующей ветке except исключение присваивается переменной mr.
У объектов класса Exception (и производных от него) определен метод __str__() так, чтобы выводить значения атрибутов. Поэтому можно не обращаться напрямую к полям объекта, например, так: mr.txt.
Кроме того у экземпляров Exception есть атрибут args. Через него можно получать доступ к отдельным полям:
class MyError(Exception): def __init__(self, text, num): self.txt = text self.n = num a = input("Input positive integer: ") try: a = int(a) if a < 0: raise MyError("You give negative!", a) except ValueError: print("Error type of value!") except MyError as mr: print(mr) print(mr.args) print(mr.args[0]) print(mr.args[1]) else: print(a)
Пример выполнения:
Input positive integer: -3 ('You give negative!', -3) ('You give negative!', -3) You give negative! -3
Пример наследования от классов-исключений. При перехвате родительский класс "ловит" дочерние, но не наоборот.
class General(Exception): pass class Specific1(General): pass class Specific2(General): pass def raiser0(): x = General() raise x def raiser1(): x = Specific1() raise x def raiser2(): x = Specific2() raise x for func in (raiser0, raiser1, raiser2): try: func() except General: import sys print(sys.exc_info()[0])
<class '__main__.General'> <class '__main__.Specific1'> <class '__main__.Specific2'>