在Python中,不使用该traceback
模块,有没有办法从该函数中确定函数的名称?
假设我有一个带功能栏的模块foo.执行时foo.bar()
,有没有办法让酒吧知道酒吧的名字?或者更好的是,foo.bar
这个名字?
#foo.py
def bar():
print "my name is", __myname__ # <== how do I calculate this at runtime?
Run Code Online (Sandbox Code Playgroud) 我有这个Python应用程序不时被卡住,我无法找到在哪里.
有没有办法告诉Python解释器向您显示正在运行的确切代码?
某种即时堆栈跟踪?
相关问题:
我想知道如何退出Python而不在输出上有回溯转储.
我仍然希望能够返回错误代码,但我不想显示回溯日志.
我希望能够在exit(number)
没有跟踪的情况下退出,但是在异常(不是退出)的情况下,我想要跟踪.
我有一段类似于此的代码:
import sys
def func1():
func2()
def func2():
raise Exception('test error')
def main():
err = None
try:
func1()
except:
err = sys.exc_info()[1]
pass
# some extra processing, involving checking err details (if err is not None)
# need to re-raise err so caller can do its own handling
if err:
raise err
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)
当func2
引发异常时,我收到以下回溯:
Traceback (most recent call last):
File "err_test.py", line 25, in <module>
main()
File "err_test.py", line 22, in main
raise err …
Run Code Online (Sandbox Code Playgroud) 在numpy中我们可以做np.seterr(invalid='raise')
一个回溯警告而不是引发错误(参见这篇文章).
在什么情况下我想用一个而不是另一个?
有什么区别:
>>> import inspect
>>> print(inspect.getouterframes(inspect.currentframe()))
[(<frame object at 0x8fc262c>, '<stdin>', 1, '<module>', None, None)]
Run Code Online (Sandbox Code Playgroud)
和:
>>> import traceback
>>> traceback.extract_stack()
[('<stdin>', 1, '<module>', None)]
Run Code Online (Sandbox Code Playgroud)
更新:
另一个:
>>> import sys
>>> print(sys._getframe().f_trace,sys._getframe().f_code)
(None, <code object <module> at 0x8682a88, file "<stdin>", line 1>)
Run Code Online (Sandbox Code Playgroud)
我不明白这里的细微差别:
更新2,问题问题后的一段时间,但非常相关
我试图从multiprocessing.Process中获取一个traceback对象.不幸的是,通过管道传递异常信息不起作用,因为无法对pickback对象进行pickle:
def foo(pipe_to_parent):
try:
raise Exception('xxx')
except:
pipe_to_parent.send(sys.exc_info())
to_child, to_self = multiprocessing.Pipe()
process = multiprocessing.Process(target = foo, args = (to_self,))
process.start()
exc_info = to_child.recv()
process.join()
print traceback.format_exception(*exc_info)
to_child.close()
to_self.close()
Run Code Online (Sandbox Code Playgroud)
追溯:
Traceback (most recent call last):
File "/usr/lib/python2.6/multiprocessing/process.py", line 231, in _bootstrap
self.run()
File "/usr/lib/python2.6/multiprocessing/process.py", line 88, in run
self._target(*self._args, **self._kwargs)
File "foo", line 7, in foo
to_parent.send(sys.exc_info())
PicklingError: Can't pickle <type 'traceback'>: attribute lookup __builtin__.traceback failed
Run Code Online (Sandbox Code Playgroud)
有没有其他方法来访问异常信息?我想避免传递格式化的字符串.
以下片段:
import traceback
def a():
b()
def b():
try:
c()
except:
traceback.print_exc()
def c():
assert False
a()
Run Code Online (Sandbox Code Playgroud)
生成此输出:
Traceback (most recent call last):
File "test.py", line 8, in b
c()
File "test.py", line 13, in c
assert False
AssertionError
Run Code Online (Sandbox Code Playgroud)
如果我想要完整的堆栈跟踪包括对一个?的调用,我应该使用什么?
如果重要的话我有Python 2.6.6
编辑:我想得到的是,如果我离开尝试除外,我将得到的相同信息,并将异常传播到顶层.这个代码段例如:
def a():
b()
def b():
c()
def c():
assert False
a()
Run Code Online (Sandbox Code Playgroud)
生成此输出:
Traceback (most recent call last):
File "test.py", line 10, in <module>
a()
File "test.py", line 2, in a
b()
File "test.py", line 5, in b …
Run Code Online (Sandbox Code Playgroud) 我写了很多使用外部库的Python代码.我经常写一个bug,当我运行代码时,我会在Python控制台中获得一个很长的回溯.99.999999%的时间是由于我的代码中的编码错误,而不是因为包中的错误.但是回溯一直到程序包代码中的错误行,要么需要大量滚动回溯来查找我编写的代码,要么回溯是如此深入到我自己的代码所没有的包中.甚至出现在追溯中.
有没有办法"黑盒子"包装代码,或以某种方式只显示我的代码中的追溯线?我希望能够向系统指定我想要追溯的目录或文件.
我观察到了一个traceback()
我不理解的交互式和非交互式R会话之间的不同.对于下面的代码,它会产生错误,但在交互式R会话中,我可以看到回溯信息,而如果我将代码保存到test.R
并通过Rscript test.R
或调用它R -f test.R
,我将无法再看到回溯:
f = function() {
on.exit(traceback())
1 + 'a'
}
f()
Run Code Online (Sandbox Code Playgroud)
在交互式R会话中:
> f = function() {
+ on.exit(traceback())
+ 1 + 'a'
+ }
> f()
Error in 1 + "a" : non-numeric argument to binary operator
1: f()
Run Code Online (Sandbox Code Playgroud)
非交互式执行:
$ Rscript test.R
Error in 1 + "a" : non-numeric argument to binary operator
Calls: f
No traceback available
Execution halted
Run Code Online (Sandbox Code Playgroud)
我没有看到解释?traceback
,我想知道是否有一种方法可以为非交互式R会话启用回溯.谢谢!