Распечатка кортежа функции sys.exc_info()

Doctor_Z

Новичок
Пользователь
Дек 3, 2021
2
0
1
операционная система: Windows 10, Python version 3.9.9,
Package Version
------- -------
pip 21.3.1

Случайно столкнулся с тем, что возвращаемый кортеж функции sys.exc_info() по-разному отображается при выводе "целиком" и выводе поэлементно:

Python:
#  Класс исключений
class Some_Exc (Exception): pass
#
import sys
#-------------------------------------------------------------------------------------
# Обработка исключения 1
try:
    raise Some_Exc()  # если нет аргументов
except  Some_Exc:
    print('\n 1) Исключение отслежено: \n', sys.exc_info(),
                 '\n 2) А теперь поэлементно:')
    for k in range(len(sys.exc_info())):
        print ('\t info[', k,'] = ', sys.exc_info()[k])
    print(' = ' * 40)
#---------------------------------------------------------------------------------------
# Обработка исключения 2
try:
    raise Some_Exc('Val', 25)  # с аргументами (случайный набор)
except  Some_Exc:
    print('\n 1) Исключение отслежено: \n', sys.exc_info(),
                 '\n 2) А теперь поэлементно:')
    for k in range(len(sys.exc_info())):
        print ('\t info[', k,'] = ', sys.exc_info()[k])

Результат работы:
1) Исключение отслежено:
(<class '__main__.Some_Exc'>, Some_Exc(), <traceback object at 0x000001F524C98780>)
2) А теперь поэлементно:
info[ 0 ] = <class '__main__.Some_Exc'>
info[ 1 ] =
info[ 2 ] = <traceback object at 0x000001F524C98780>
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =

1) Исключение отслежено:
(<class '__main__.Some_Exc'>, Some_Exc('Val', 25), <traceback object at 0x000001F524C98780>)
2) А теперь поэлементно:
info[ 0 ] = <class '__main__.Some_Exc'>
info[ 1 ] = ('Val', 25)
info[ 2 ] = <traceback object at 0x000001F524C98780>
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =

Обратите внимание на элемент sys.exc_info()[1] при выводе целиком и info[ 1 ] при выводе поэлементно.
В чем причина?
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
В реализации метода __str__ класса Exception (при выводе на экран отображаются только аргументы класса).
Чтобы сделать отображение при выводе на экран одинаковым для обоих случаев (в составе кортежа и отдельно) можно переопределить метод __str__ в классе Some_Exc:
Python:
#  Класс исключений
class Some_Exc (Exception):
    def __str__(self):
        return f"{self.__class__.__name__}{super().__str__() or '()'}"
 
  • Мне нравится
Реакции: Doctor_Z

Doctor_Z

Новичок
Пользователь
Дек 3, 2021
2
0
1
Спасибо. Теперь всё работает, с небольшой поправочкой:

Python:
class Some_Exc (Exception):
    def __str__(self):                 # Добавляем, иначе печать в кортеже и
                                       # печать поэлементно будут различаться.
        stl = super().__str__()
        l = len(stl.split(','))        # Считаем количество аргументов:
        if  l <2:                      # если их меньше 2, то это не кортеж
            return f"{self.__class__.__name__}({stl})"
        else:                          # Иначе -- печать кортежа
            return f"{self.__class__.__name__}{stl}"

Вопрос решен!
 

Форум IT Специалистов