Module (95%)
Section (80%)

Как создать собственное исключение: продолжение

Посмотрите на код в редакторе. Мы объединили два ранее определенных исключения и использовали их для работы с небольшим примером фрагмента.

Один из них вызывается внутри функции makePizza(), когда обнаруживается любая из двух ошибочных ситуаций: неправильный запрос пиццы или запрос слишком большого количества сыра.

Примечание:

  • удаление ветви, начинающейся с исключения TooMuchCheeseError, приведет к тому, что все появляющиеся исключения будут классифицированы как PizzaError;
  • удаление ветви, начинающейся с исключения PizzaErrorwill, приводит к тому, что исключения TooMuchCheeseError остаются необработанными, и приводит к завершению программы.

Предыдущее решение, хотя и элегантное и эффективное, имеет один важный недостаток. Из-за несколько легкого способа объявления конструкторов, новые исключения не могут использоваться как есть, без полного списка необходимых аргументов.

Мы у class PizzaError(Exception): def __init__(self, pizza='uknown', message=''): Exception.__init__(self, message) self.pizza = pizza class TooMuchCheeseError(PizzaError): def __init__(self, pizza='uknown', cheese='>100', message=''): PizzaError.__init__(self, pizza, message) self.cheese = cheese def make_pizza(pizza, cheese): if pizza not in ['margherita', 'capricciosa', 'calzone']: raise PizzaError if cheese > 100: raise TooMuchCheeseError print("Pizza ready!") for (pz, ch) in [('calzone', 0), ('margherita', 110), ('mafia', 20)]: try: make_pizza(pz, ch) except TooMuchCheeseError as tmce: print(tmce, ':', tmce.cheese) except PizzaError as pe: print(pe, ':', pe.pizza)

Теперь, если позволяют обстоятельства, можно использовать только имена классов.



Code

class PizzaError(Exception):
def __init__(self, pizza, message):
Exception.__init__(self, message)
self.pizza = pizza


class TooMuchCheeseError(PizzaError):
def __init__(self, pizza, cheese, message):
PizzaError.__init__(self, pizza, message)
self.cheese = cheese


def make_pizza(pizza, cheese):
if pizza not in ['margherita', 'capricciosa', 'calzone']:
raise PizzaError(pizza, "no such pizza on the menu")
if cheese > 100:
raise TooMuchCheeseError(pizza, cheese, "too much cheese")
print("Pizza ready!")

for (pz, ch) in [('calzone', 0), ('margherita', 110), ('mafia', 20)]:
try:
make_pizza(pz, ch)
except TooMuchCheeseError as tmce:
print(tmce, ':', tmce.cheese)
except PizzaError as pe:
print(pe, ':', pe.pizza)
{{ dockerServerErrorMsg }} ×
{{ errorMsg }} ×
{{ successMsg }} ×