Как создать собственное исключение: продолжение
Посмотрите на код в редакторе. Мы объединили два ранее определенных исключения и использовали их для работы с небольшим примером фрагмента.
Один из них вызывается внутри функции 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)