我的一个类的实例变量正在发生一些事情.我想让变量成为一个属性,无论何时访问它,我都要打印出导致该点的所有代码的堆栈跟踪,这样我就可以看到它被搞乱了.如果没有引发异常,如何打印堆栈跟踪?我知道如果有例外,我可以做类似的事情traceback.format_tb(sys.exc_info()[2]).
另外可能有用的是仅打印最后3-4个级别,因为前几个级别可能不会那么有趣.
如何在以下情况下获得完整的回溯,包括调用func2和func函数?
import traceback
def func():
    try:
        raise Exception('Dummy')
    except:
        traceback.print_exc()
def func2():
    func()
func2()
当我运行这个时,我得到:
Traceback (most recent call last):
  File "test.py", line 5, in func
    raise Exception('Dummy')
Exception: Dummy
traceback.format_stack()不是我想要的,因为需要将traceback对象传递给第三方模块.
我对这个案子特别感兴趣:
import logging
def func():
    try:
        raise Exception('Dummy')
    except:
        logging.exception("Something awful happened!")
def func2():
    func()
func2()
在这种情况下,我得到:
ERROR:root:Something awful happened!
Traceback (most recent call last):
  File "test.py", line 9, in func
    raise Exception('Dummy')
Exception: Dummy
假设我有一个功能:
def ReadFile():
    with open("/etc/passwd") as file:
        data = file.read()
这个函数可能会成功,在这种情况下它需要返回一个结果,或者它可能会失败,在这种情况下我想返回一个异常的回溯,它会通过电子邮件发送给我,所以我知道我的程序中出现了一些错误,确切地说什么失败了。
为此,我可以执行以下操作:
import traceback
def ReadFile():
    try:
        with open("/etc/passwd") as file:
            data = file.read()
    except IOError:
        return traceback.format_exc()
    return data
如果能够成功读取文件,则返回文件的内容。否则,它返回异常的回溯。
traceback.format_exc() 返回一个字符串。如果 ReadFile() 应该返回一个列表或元组或整数(如果它成功),那么事情就很简单了——当你调用 ReadFile() 时,如果返回的结果是一个字符串,你就知道它失败了,你可以运行发送电子邮件的代码您知道错误,如果结果是您期望的类型(int、tuple、list 或 w/e),那么您就知道它起作用了。
如果 ReadFile() 应该返回一个字符串,就像在我的例子中那样,那么比确定 ReadFile() 是成功还是失败变得更加困难,因为您需要解析字符串以确定它是否看起来像回溯或你预期的结果。
有一个更好的方法吗?也许某种方式让回溯返回某种对象,其信息与 traceback.format_exc() 包含的信息相同,以便更容易确定 ReadFile() 是成功还是失败?