Python исключение: как распечатать последние десять строк трассировки стека? - PullRequest
4 голосов
/ 02 апреля 2020

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

Какой код может go в обработчик исключений, чтобы напечатать трассировку стека так, как это происходит с необработанным исключением, кроме только напечатать последние десять строк?

Ответы [ 2 ]

2 голосов
/ 02 апреля 2020

Попробуйте это:

# import trace back module and get stack trace
import traceback 
try:
  statement
except:
  error = traceback.format_exc()

# split stack trace into a list and slice it
stack_trace = error.split('\n')
stack_trace[len(stack_trace)-10:len(stack_trace)+1]
1 голос
/ 02 апреля 2020

sys.excepthook позволяет указать функцию для печати в stderr и использовать traceback.format_tb для анализа трассировки. Преимущество в том, что здесь вам не нужно ловить ошибку от try ... except.

import sys
import traceback as tb

def except_hook(type, value, traceback):
    lines = 10
    tb_lines = "".join(tb.format_tb(traceback)).split("\n")
    print("\n".join(tb_lines[-lines:] + [repr(value)]), file=sys.stderr)

sys.excepthook = except_hook

def a(x):
    return b(x)

def b(x):
    return c(x)

def c(x):
    return d(x)

def d(x):
    return x / 0

a(5)

, который выдает:

~ python err.py
    a(5)
  File "err.py", line 12, in a
    return b(x)
  File "err.py", line 15, in b
    return c(x)
  File "err.py", line 18, in c
    return d(x)
  File "err.py", line 21, in d
    return x / 0

ZeroDivisionError('division by zero')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...