Могу ли я изменить стек «недавних вызовов» при возникновении исключения в Python? - PullRequest
1 голос
/ 07 июня 2019

Когда я поднимаю исключение в кодах, Python показывает стек вызовов. Последний вызов - это то, где я вызываю код исключения. Но это не важный код сам по себе. Могу ли я изменить стек вызовов, чтобы скрыть код "повысить ..."?

Мой код:

def myFunc(var):
  if isinstance(var, int) is True:
    print('var:', var)
  else:
    raise TypeError('Invalid type.')


def wrapperFunc(var):
  myFunc(var)


if __name__ == '__main__':
  wrapperFunc('abc')

Результат:

Traceback (most recent call last):
  File "C:/Users/snoma/study/python/etc/trackImageEdge/exceptTest.py", line 13, in <module>
    wrapperFunc('abc')
  File "C:/Users/snoma/study/python/etc/trackImageEdge/exceptTest.py", line 9, in wrapperFunc
    myFunc(var)
  File "C:/Users/snoma/study/python/etc/trackImageEdge/exceptTest.py", line 5, in myFunc
    raise TypeError('Invalid type.')
TypeError: Invalid type.

Последний вызов - это код "повысить ошибку типа ...", и я думаю, что это необязательная информация. Как я могу это скрыть?

1 Ответ

1 голос
/ 07 июня 2019

Вы можете использовать модуль traceback для ограничения информации с обратной трассировки

import sys
import traceback

def c():
  a = 1/0

def b():
  c()

def a():
  b()

try:
  a()
except:
  t, v, bt = sys.exc_info()
  traceback.print_tb(bt, limit=2)
  traceback.print_tb(bt)

Игра с трассировкой стека

Вы можете поиграть с формой стека, но я думаю, что невозможно устранить первоначальную причину ошибки

import sys
import traceback

def c(): 1/0
def b(): c()
def a(): b()


t = None
v = None
bt = None

try:
  a()
except:
  t, v, bt = sys.exc_info()

bt = None  # you can play here with changing bt.tb_next order

raise exc.with_traceback(bt)
...