Как я могу уменьшить вывод Python, повышающий исключение? - PullRequest
1 голос
/ 05 августа 2020

У меня есть эта строка кода Python:

raise ValueError(f"Invalid input '{number}'")

Когда возникает исключение, я получаю:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/snowcrash/Code/Python/mycode/mycode.py", line 8, in __init__
    raise ValueError(f"Invalid input '{number}'")
ValueError: Invalid input 'a1b2c3'

, но я бы предпочел получить:

File "/home/snowcrash/Code/Python/mycode/mycode.py", line 8, in __init__
  ValueError: Invalid input 'a1b2c3'

Как мне этого добиться?

1 Ответ

2 голосов
/ 05 августа 2020

sys.excepthook(type, value, traceback) - это функция, которая выполняет печать при возникновении исключения. Вы можете написать свою собственную функцию (с аналогичной подписью) и просто заменить ее на:

sys.excepthook = myfunction

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

Однако, если все, что вы хотите сделать, это отформатировать сообщение трассировки, вам уже предоставлено множество удобных вещей. Подробности можно найти в документации traceback, но вот пример, который дает примерно желаемый результат:

import sys, traceback


def myhook(type, value, tb):
    trace = traceback.format_tb(tb, limit=1)
    trace = trace[0].split("\n")[0]
    exc = traceback.format_exception_only(type, value)[0]
    print(trace + "\n" + exc)


sys.excepthook = myhook

number = "a1b2c3"
raise ValueError(f"Invalid input {number}")

, который дает результат:

  File "scratch/so.py", line 14, in <module>
ValueError: Invalid input a1b2c3

Обратите особое внимание на использование traceback.format_tb с limit=1, чтобы ограничить вывод трассировки стека. Этих функций множество в модуле traceback.

...