有没有办法让 ipython 只显示异常
捕获,而不是显示在代码中被捕获的位置?
你可以使用sys.excepthook:
import sys
def exc_hook(type, value, traceback):
print type
sys.excepthook = exc_hook
来自sys module documentation:
sys.excepthook(type, value, traceback)
这个函数打印出一个给定的回溯和异常
sys.stderr.
当异常被引发但未被捕获时,解释器调用
sys.excepthook 带三个参数,异常类,异常
实例和回溯对象。在交互式会话中,这
发生在控制权返回到提示符之前;在 Python 中
程序这发生在程序退出之前。的处理
可以通过分配另一个来自定义此类顶级异常
三参数函数为sys.excepthook。
sys.__displayhook__
sys.__excepthook__
这些对象包含 displayhook 的原始值和
程序开始时的异常钩子。他们得救了
displayhook 和 excepthook 可以恢复,以防它们碰巧得到
替换为损坏的对象。
您也可以尝试将--xmode 选项设置为Plain 来启动ipython
来自IPython reference:
$ ipython [options] files
--xmode=<modename>
异常报告模式。
有效模式:Plain、Context 和 Verbose。
Plain:类似于python的正常回溯打印。
上下文:在回溯中的每一行周围打印 5 行上下文源代码。
详细:类似于 Context,但额外打印当前可见的异常发生的变量(缩短它们的
字符串如果太长)。如果发生这种情况,这可能会非常缓慢
拥有庞大的数据结构,其字符串表示很复杂
计算。您的计算机可能会因 cpu 冻结一段时间
使用率为 100%。如果发生这种情况,您可以取消回溯
Ctrl-C(可能不止一次)。
以下是一些示例用法。请注意每个回溯的行数差异:
--xmode=Plain:
[ 19:55 jon@hozbox ~/SO/python ]$ ipython --xmode=Plain ipython-debugger-full-traceback-on-interactive-pdb.py
------------------------------------------------------------
Traceback (most recent call last):
File "ipython-debugger-full-traceback-on-interactive-pdb.py", line 2, in <module>
1 / 0
ZeroDivisionError: integer division or modulo by zero
--xmode=Context:
[ 19:55 jon@hozbox ~/SO/python ]$ ipython --xmode=Context ipython-debugger-full-traceback-on-interactive-pdb.py
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
/home/jon/SO/python/ipython-debugger-full-traceback-on-interactive-pdb.py in <module>()
1
----> 2 #!/usr/bin/python
3 1 / 0
4
5
ZeroDivisionError: integer division or modulo by zero
--xmode=Verbose:
[ 19:54 jon@hozbox ~/SO/python ]$ ipython --xmode=Verbose ipython-debugger-full-traceback-on-interactive-pdb.py
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
/home/jon/SO/python/ipython-debugger-full-traceback-on-interactive-pdb.py in <module>()
1
----> 2 #!/usr/bin/python
3 1 / 0
4
5
ZeroDivisionError: integer division or modulo by zero
并且不指定 .py 文件:
--xmode=Plain:
[ 19:55 jon@hozbox ~/SO/python ]$ ipython --xmode=Plain
In [1]: 1 / 0
------------------------------------------------------------
Traceback (most recent call last):
File "<ipython console>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
--xmode=Context:
[ 20:03 jon@hozbox ~/SO/python ]$ ipython --xmode=Context
In [1]: 1 / 0
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
/home/jon/SO/python/<ipython console> in <module>()
ZeroDivisionError: integer division or modulo by zero
--xmode=Verbose:
[ 20:01 jon@hozbox ~/SO/python ]$ ipython --xmode=Verbose
In [1]: 1 / 0
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
/home/jon/SO/python/<ipython console> in <module>()
ZeroDivisionError: integer division or modulo by zero
Using the Python debugger.