Могу ли я изменить то, что печатает pdb при возникновении исключения? - PullRequest
0 голосов
/ 10 июля 2020

Я запускаю:

python -m pdb script_that_throws.py

Когда сценарий выдает, скажем, из-за неудачного утверждения, pdb печатает всю трассировку стека + какой-то бессмысленный шаблонный текст:

Traceback (most recent call last):
  File "/usr/lib/python3.6/pdb.py", line 1667, in main
    pdb._runscript(mainpyfile)
  File "/usr/lib/python3.6/pdb.py", line 1548, in _runscript
    self.run(statement)
  File "/usr/lib/python3.6/bdb.py", line 434, in run
    exec(cmd, globals, locals)
  File "<string>", line 1, in <module>
  [... many lines of stack trace omitted for brevity ...]
  File "/path/to/script_that_throws.py", line 26, in _ul
    assert v.keys() == self._expected_keys
AssertionError
Uncaught exception. Entering post mortem debugging
Running 'cont' or 'step' will restart the program
> /path/to/script_that_throws.py(26)_ul()
-> assert v.keys() == self._expected_keys
(Pdb)

Я бы хотел, чтобы Python отображал только:

AssertionError
> /path/to/script_that_throws.py(26)_ul()
-> assert v.keys() == self._expected_keys
(Pdb)

Есть ли способ добиться этого?

Ответы [ 2 ]

0 голосов
/ 11 июля 2020

Есть хороший и плохой ответ.

Хороший. Конечно, вы можете подавить эти сообщения.

И теперь в игру вступает плохой ответ.

Вы должны изменить cpython исходный код и перекомпилировать это.

Это не так сложно, как кажется на первый взгляд, тем более что pdb - это модуль Python, и C знаний не требуется.

Это важная часть исходного кода:

https://github.com/python/cpython/blob/master/Lib/pdb.py#L1718 -L1725

Существует отличная документация о том, как скомпилировать Python: https://docs.python.org/3/using/unix.html#building - python

Кроме того, Энтони Шоу только что опубликовал книгу, которая дает хорошее введение о том, как работать с cpython, реализацией C языка Python.

На случай, если вы ожидали другого типа ответа, нет, нет опции конфигурации для PDB, чтобы подавить такие сообщения.

0 голосов
/ 10 июля 2020

Было бы неплохо узнать, что делает script_that_throws.py. Вы пробовали использовать try и except в своем скрипте? Это может помочь вам обработать исключения pdb для печати того, что вы хотите. Примерно так:

n = input("age ")
try:
    print(int(n))
except ValueError:
    print("error")

Вы также можете вручную вызвать собственное исключение, как показано в этой цепочке: Вручную вызвать (выбросить) исключение в Python

...