【问题标题】:How can i show the line in which the error occurs?如何显示发生错误的行?
【发布时间】:2021-01-08 09:25:47
【问题描述】:

所以我遵循了一个使用 pygame 的 python 游戏构建教程,我向它添加了一些功能,它在达到某个阶段后崩溃。我不知道哪一行是问题所以我在阅读了一些关于它的教程后实现了日志记录,但是我无法获取日志文件来显示哪一行是问题,我用谷歌搜索并且唯一实际显示它的代码有tryexcept 是否需要在游戏中实现它们才能获得特定的线路?我不确定这在游戏中是否有效。有没有办法让日志文件包含其中的行?谢谢!我也是编码新手,只是把它放在那里。

#logging config
logging.basicConfig(filename="log.txt", level=logging.DEBUG,filemode="w",format="%(asctime)s:%(levelname)s:%(message)s",datefmt="%d/%m/%Y %I:%M:%S %p")

#Logging
logging.debug('Debug Information')
logging.info('info Information')
logging.warning('warning Information')
logging.error('error Information')
logging.critical('critical Information')

【问题讨论】:

标签: python logging


【解决方案1】:

解决方案是覆盖 python 默认错误处理程序,以添加日志记录命令:

import sys
import traceback

logging.basicConfig(
    filename="log.txt",
    level=logging.DEBUG,
    filemode="w",
    format="%(asctime)s:%(levelname)s:%(message)s",
    datefmt="%d/%m/%Y %I:%M:%S %p"
)

SYS_EXCEPT_HOOK = sys.excepthook


def _excepthook(typ, value, trace):
    """ override builtin excepthook """
    logging.error("{}\n{}\n{}".format(typ.__name__, value, ''.join(traceback.format_tb(trace))))
    SYS_EXCEPT_HOOK(typ, value, trace)

sys.excepthook = _excepthook

a = 1 / 0

这将记录:

08/01/2021 10:37:38 AM:ERROR:ZeroDivisionError
division by zero
  File "/home/devone/dev/scripts/sugar2dolibarr/test.py", line 23, in <module>
    a = 1 / 0

更新

每个抛出的异常都由sys.excepthook 内置方法处理。

在这里,我创建了一个新方法(_excepthook,但您可以选择所需的名称)来处理异常。

但是由于我们仍然希望 python 在我们记录后处理这个异常,我将初始的 excepthook 存储在一个变量中(这里:SYS_EXCEPT_HOOK 但同样,你选择名称),我们在记录后立即调用它错误。

然后我们将默认的 sys.excepthook 替换为我们刚刚制作的那个。

traceback 库的唯一作用是重建异常的 traceback,就像默认的错误处理程序一样。

【讨论】:

  • 非常感谢!我可能需要阅读回溯文档以了解其工作原理
  • 我用更多解释更新了我的答案,如果不是很清楚,你告诉我这对你来说是否更清楚?
  • 确实做到了,非常感谢!
猜你喜欢
  • 1970-01-01
  • 2017-05-16
  • 1970-01-01
  • 1970-01-01
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多