Как распечатать полную трассировку без остановки программы?

Непустые строки являются правдивыми, но не обязательно эквивалентны true.


== является «мягким» оператором равенства. Он использует принуждение типа, чтобы сравнить два эквивалентных объекта как равные.

Все следующее верно:

42 == "42"
0 == false
0 == ""
[] == ""
{} == "[object Object]"
"1" == true

Аргументные строки не эквивалентны никаким примитивным значениям. Однако


Когда вы пишете if (something), if будет выполняться, если something является «правдивым».

Все значения правдивы, кроме следующих:

  • false
  • 0
  • NaN
  • ""
  • null
  • undefined
639
задан whackamadoodle3000 13 December 2017 в 04:14
поделиться

1 ответ

Некоторые другие ответы уже указали на модуль traceback .

Обратите внимание, что при использовании print_exc в некоторых угловых случаях вы не получите того, чего ожидаете. В Python 2.x:

import traceback

try:
    raise TypeError("Oups!")
except Exception, err:
    try:
        raise TypeError("Again !?!")
    except:
        pass

    traceback.print_exc()

... будет отображать трассировку последнего исключения :

Traceback (most recent call last):
  File "e.py", line 7, in <module>
    raise TypeError("Again !?!")
TypeError: Again !?!

Если вам действительно нужно получить доступ к исходному traceback . Одним из решений является кэширование информации об исключении , возвращенной из exc_info , в локальную переменную и отображение ее с помощью print_exception :

import traceback
import sys

try:
    raise TypeError("Oups!")
except Exception, err:
    try:
        exc_info = sys.exc_info()

        # do you usefull stuff here
        # (potentially raising an exception)
        try:
            raise TypeError("Again !?!")
        except:
            pass
        # end of useful stuff


    finally:
        # Display the *original* exception
        traceback.print_exception(*exc_info)
        del exc_info

Производство:

Traceback (most recent call last):
  File "t.py", line 6, in <module>
    raise TypeError("Oups!")
TypeError: Oups!

Несколько ловушек с этим, хотя:

  • Из документа sys_info :

    Присвоение возвращаемого значения traceback локальной переменной в функции, которая обрабатывает исключение, вызовет циклическую ссылку . Это предотвратит сбор мусора, на который ссылается локальная переменная в той же функции или трассировка. [...] Если вам нужна трассировка, обязательно удалите ее после использования (лучше всего делать с помощью оператора try ... finally)

  • , но из того же документа:

    Начиная с Python 2.2, такие циклы автоматически восстанавливаются , когда сборка мусора включена и становится недоступной, но она остается более эффективной для избегайте создания циклов.


С другой стороны, предоставляя вам доступ к трассировке , связанной с исключением, Python 3 дает менее удивительный результат:

import traceback

try:
    raise TypeError("Oups!")
except Exception as err:
    try:
        raise TypeError("Again !?!")
    except:
        pass

    traceback.print_tb(err.__traceback__)

... будет отображаться:

  File "e3.py", line 4, in <module>
    raise TypeError("Oups!")
458
ответ дан Mr_and_Mrs_D 13 December 2017 в 04:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: