首页 > 解决方案 > 获取traceback.print_stack()的帧输入参数的正确方法

问题描述

我正在尝试使用traceback.print_stack()打印导致错误的堆栈,而不包括实际打印堆栈的行。例如:

import os
import pathlib
import sys
import traceback


def main():
  path = pathlib.Path('/foo')
  content_bytes = b''
  my_func(path, content_bytes)

def my_func(path, content_bytes):
  for (dirpath, dirnames, filenames) in os.walk(path, onerror=on_error(path)):
    for filename in filenames:
      file: bytes = open(dirpath + "/" + filename, "rb").read()
      content_bytes += file

def on_error(path):
  traceback.print_stack(sys._getframe(1))
  print("path is not a dir path supplied: {}".format(path))

main()

假设我没有命名/foo此打印的目录:

path is not a dir path supplied: /foo
  File "/{projectDir}/examples/test.py", line 22, in <module>
    main()
  File "/{projectDir}/examples/test.py", line 10, in main
    my_func(path, content_bytes)
  File "/{projectDir}/examples/test.py", line 13, in my_func
    for (dirpath, dirnames, filenames) in os.walk(path, onerror=on_error(path)):

如我所愿,但我_getframe为这样做而调用受保护的 sys 方法这一事实感到困扰。Pycharm 似乎也不喜欢我这样做。是否有更合适的方法来获取堆栈中用作第一个参数的当前/上一个帧traceback.print_stack

我看到了很多以前的 SO 答案,sys.exc_info()但在这种情况下,这似乎是一个填充有 None 对象的元组。

标签: pythonpython-3.xstack-tracetraceback

解决方案


推荐阅读