我的方法的第一行是:
print "this method was called from "+filename_and_linenumber_of_code_that_called_it.
是否可以抛出异常,立即捕获它,并在调用方法时打印堆栈跟踪?
答案 0 :(得分:4)
无需抛出异常即可查看堆栈。我有这个很好的功能(它不完美,但我认为它有效)可以帮助你:
import inspect
def log(error):
frame, filename, ln, fn, lolc, idx = inspect.getouterframes(inspect.currentframe())[1]
print "Error: " + error + " " + filename, ln, fn
它打印消息,后跟父函数所在文件的名称,然后是该文件中调用的行号,然后是函数的名称。我希望它能帮到你:)。
答案 1 :(得分:4)
当我只是想在某些时候使代码崩溃以查看回溯时,我只是在代码中添加了“crash
”。因为它没有定义,它会崩溃,我将在django的异常页面中看到回溯。如果另外,我使用runserver_plus
提供的django-extensions
命令(需要包werkzeug
),然后我会 an AJAX shell at each frame of the stacktrace 。
我理解你的问题,我将提出一种处理这类问题的专业方法。 您要做的事情被称为“debugging”,并且有适合的工具。
<强>快速启动强>:
运行pip install ipython ipdb
按import ipdb; ipdb.set_trace()
在runserver中执行你的代码,它会暂停并生成一个python shell,在那里你可以发送命令“up
”转到前面的堆栈帧(代码调用你的代码)< / strong>即可。如果要查看更多代码行,请键入l
。
更长的开始:实际上我写了an overview of tools which help debugging python and django。
我不同意其他建议添加更精细的印刷声明的答案。 您希望成为一名优秀的开发人员:您希望使用调试器。无论是werkzeug,pdb / ipdb还是GUI,只要你能使用它就没关系。
答案 2 :(得分:1)
这是CPython特有的:
import sys
def func():
frm = sys._getframe(1)
print 'called from %s, line %s' % (frm.f_code.co_filename, frm.f_lineno)
def test():
func() # line 8
test()
打印:
called from /path/to/script.py, line 8
答案 3 :(得分:0)