ipdb很棒;哇。问题是,当一个脚本爆炸时,我仍然需要进入代码并添加四行,这些行不需要输入 ton ,但也没有。例如,假设这是坏线:
public YourFragment getYourFragment() {
YourFragmentt yourFragment = null;
if (getChildFragmentManager() != null) {
List<Fragment> fragments =getChildFragmentManager().getFragments();
if (fragments != null) {
for (Fragment fragment : fragments) {
if (fragment instanceof yourFragmentFragment) {
yourFragment = (YourFragment) fragment;
break;
}
}
}
}
return yourFragment;
}
当然,我明白了:
1 = 2
如果出于某种原因我想调试该行并查看该行之前(或当时堆栈中的其他位置)发生了什么,我通常会更改该行代码,如下所示:
SyntaxError: can't assign to literal
这可以完成工作,但是我希望能够以“模式”运行脚本,无论什么时候爆炸(假设异常未处理),我得到相同的结果。
存在吗?
******* ******* EDIT
感谢@ np8的回复,我将驱动程序脚本重写为这样(try:
1 = 2
except:
import traceback;traceback.print_exc()
import ipdb;ipdb.set_trace()
是任意函数):
main
这允许我从命令行确定异常是否应该启动ipdb(即我正在开发时)(即当脚本在生产中运行时因此详细程度参数低于2,在此示例中) )。
答案 0 :(得分:0)
您正在寻找的是“事后调试”。获得所需内容的最简单方法是使用
运行脚本ipdb script.py
或
python -m pdb script.py
而不是
python script.py
答案 1 :(得分:0)
您可以使用launch_ipdb_on_exception
上下文管理器:
# test.py
from ipdb import launch_ipdb_on_exception
with launch_ipdb_on_exception():
print(x)
运行上述操作将导致启动ipdb:
python .\test.py
NameError("name 'x' is not defined",)
> c:\tmp\delete_me\test.py(4)<module>()
2
3 with launch_ipdb_on_exception():
----> 4 print(x)
ipdb>
答案 2 :(得分:0)
pm
是一个函数装饰器,它反映了
ipdb 上下文管理器 launch_ipdb_on_exception
。用它来装饰
一个函数,该函数将在出错时转到 ipdb。
“pm”这个名字来自 ipdb.pm() 函数,它代表
事后分析,行为类似。
有了这个,你可以用 @pm
修饰你想要调试的顶级函数,并且调用堆栈中该级别或以下级别的任何异常都将触发 ipdb。
import ipdb
class Decontext(object):
"""
Makes a context manager also act as decorator
"""
def __init__(self, context_manager):
self._cm = context_manager
def __enter__(self):
return self._cm.__enter__()
def __exit__(self, *args, **kwds):
return self._cm.__exit__(*args, **kwds)
def __call__(self, func):
def wrapper(*args, **kwds):
with self:
return func(*args, **kwds)
return wrapper
pm = Decontext(ipdb.launch_ipdb_on_exception())