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)
Report a BugSettingsCopy to ClipboardPasteShareDownloadUpload Local FileResetTipTip