Подробная анатомия исключений
Давайте подробнее рассмотрим объект исключения, поскольку здесь есть несколько действительно интересных элементов (мы вернемся к этой проблеме вскоре, когда рассмотрим базовые методы ввода/вывода Python, поскольку их подсистема исключений немного расширяет эти объекты). р>
Класс BaseException
представляет свойство с именем args
. Это кортеж, предназначенный для сбора всех аргументов, переданных конструктору класса. Он пуст, если конструкция была вызвана без каких-либо аргументов, или содержит только один элемент, когда конструктор получает один аргумент (здесь мы не учитываем аргумент self
) и т.д.
Мы подготовили простую функцию для элегантного вывода свойства args
. Вы можете увидеть функцию в редакторе.
Мы использовали функцию для печати содержимого свойства args
в трех разных случаях, когда исключение класса Exception
вызывается тремя разными способами. Чтобы сделать его более впечатляющим, мы также напечатали сам объект вместе с результатом вызова __str__()
.
Первый случай выглядит рутинно - после ключевого слова raise
есть только имя Exception. Это означает, что объект этого класса был создан самым обычным способом.
Второй и третий случаи могут показаться немного странными на первый взгляд, но здесь нет ничего странного - это всего лишь вызовы конструктора. Во втором операторе raise
конструктор вызывается с одним аргументом, а в третьем - с двумя.
Как вы можете видеть, выходные данные программы отражают это, показывая соответствующее содержимое свойства args
:
: :
my exception : my exception : my exception
('my', 'exception') : ('my', 'exception') : ('my', 'exception')
output
Code
def print_args(args):lng = len(args)
if lng == 0:
print("")
elif lng == 1:
print(args[0])
else:
print(str(args))
try:
raise Exception
except Exception as e:
print(e, e.__str__(), sep=' : ' ,end=' : ')
print_args(e.args)
try:
raise Exception("my exception")
except Exception as e:
print(e, e.__str__(), sep=' : ', end=' : ')
print_args(e.args)
try:
raise Exception("my", "exception")
except Exception as e:
print(e, e.__str__(), sep=' : ', end=' : ')
print_args(e.args)