Главное, что нужно понять, это то, что происходит, когда вы пытаетесь напечатать объект (любой, не просто исключение). В фоновом режиме происходит вызов метода __str__
этого объекта и выводится его возвращаемое значение.
В разделе Обработка исключений в документации, рядом с которой в конце указано:
Для удобства экземпляр исключения определяет __str__()
, поэтому аргументы могут быть напечатаны напрямую, без ссылки на .args
.
Упомянутые args
переданы в исключение. То есть к Exception
х __init__
. В вашем случае это просто message
in:
Exception.__init__(self, message)
Если вы хотите, чтобы выводилось больше аргументов, вам нужно передать их в Exception
args. Например, если вы измените вышеприведенную строку на:
Exception.__init__(self, pizza, message)
В результате вы получите:
Pizza ready!
('margherita', 'too much cheese') : 110
('mafia', 'no such pizza on the menu') : mafia
В качестве альтернативы, вы можете просто переопределить метод __str__
для вашего исключения. Например, добавление этого к TooMuchCheeseError
:
def __str__(self):
return "Oh no! the pizza {} has too much cheese: {}".format(self.pizza, self.cheese)
теперь даст:
Pizza ready!
Oh no! the pizza margherita has too much cheese: 110 : 110
no such pizza on the menu : mafia
Наконец, тот факт, что вы передаете сообщение об ошибках, немного избыточен. Поскольку ваши исключения служат определенной цели c, сообщение может быть им присуще. Это позволяет вашей обработке быть более динамичной c. Например:
class PizzaError(Exception):
def __init__(self, pizza):
super().__init__()
self.pizza = pizza
def __str__(self):
return "Oh no! There is not a pizza '{}' on the menu".format(self.pizza)
class TooMuchCheeseError(PizzaError):
def __init__(self, pizza, cheese):
PizzaError.__init__(self, pizza)
self.cheese = cheese
def __str__(self):
return "Oh no! the pizza {} has too much cheese: {}".format(self.pizza, self.cheese)
def makePizza(pizza, cheese):
if pizza not in ['margherita', 'capricciosa', 'calzone']:
raise PizzaError(pizza)
if cheese > 100:
raise TooMuchCheeseError(pizza, cheese)
print("Pizza ready!")
for (pz, ch) in [('calzone', 0), ('margherita', 110), ('mafia', 20)]:
try:
makePizza(pz, ch)
except (TooMuchCheeseError, PizzaError) as pe:
print(pe)
напечатает:
Pizza ready!
Oh no! the pizza margherita has too much cheese: 110
Oh no! There is not a pizza 'mafia' on the menu