Я хотел просто напечатать тип исключения и сообщение.
Сначала я попытался:
try:
raise Exception("duh!!!")
except Exception as err:
print(err)
Но это только печатное сообщение об исключении.
duh!!!
Тогда япрошел весь traceback
документ , и я почувствовал, что traceback.format_exception_only()
- это то, что я ищу.
Итак, я попробовал это следующим образом:
try:
raise Exception("duh!!!")
except:
etype, evalue, tb = sys.exc_info()
print(traceback.format_exception_only(etype, evalue)))
и напечатано следующее:
['Exception: duh!!!\n']
, что выглядело немного неожиданным для меня.Поэтому я перечитал документацию по этому методу.В нем говорится следующее:
Отформатируйте исключительную часть трассировки.Аргументы - это тип и значение исключения, такие как sys.last_type
и sys.last_value
.Возвращаемое значение представляет собой список строк, каждая из которых заканчивается новой строкой.Обычно список содержит одну строку;однако для исключений SyntaxError
он содержит несколько строк, которые (при печати) отображают подробную информацию о том, где произошла синтаксическая ошибка.Сообщение, указывающее, какое исключение произошло, всегда является последней строкой в списке.
Итак, я понял, что документ говорит, что это список, поэтому в выводе [...]
есть список.Также в документе говорится, что каждая строка заканчивается новой строкой, поэтому в выводе есть \n
.Но я не понимаю, когда будет несколько строк в случае SyntaxError
?Я не могу произвести SyntaxError
, что приведет к нескольким строкам в возвращаемом значении format_exception_only()
.
Также мне вдруг показалось, что я могу просто сделать
try:
raise Exception("duh!!!")
except:
etype, evalue, tb = sys.exc_info()
print('{}: {}'.format(etype.__name__, evalue))
, чтобы получить
Exception: duh!!!
Но тогда как format_exception_only()
добавляет к этому больше значения?