Python Jupyter Notebook 中的错误异常与代码调试
首先我们定义两个函数,以便够造成一些错误和异常,方便来进行对于 Jupyter Notebook 的错误异常相关知识的学习:
In [1]:
def func1(a, b): return a / b def func2(x): a = x b = x - 1 return func1(a, b)
首先,通过调用函数,我们来引发一个“分母为零”的异常:
In [2]:
func2(1)
ZeroDivisionErrorTraceback (most recent call last) <ipython-input-2-b2e110f6fc8f> in <module>() ----> 1 func2(1) <ipython-input-1-d849e34d61fb> in func2(x) 5 a = x 6 b = x - 1 ----> 7 return func1(a, b) <ipython-input-1-d849e34d61fb> in func1(a, b) 1 def func1(a, b): ----> 2 return a / b 3 4 def func2(x): 5 a = x ZeroDivisionError: integer division or modulo by zero
在 notebooke 中执行 %xmode Plain
可以设置为当异常发生时只展示简单的异常信息。
In [3]:
%xmode Plain
Exception reporting mode: Plain
接着,我们引发相同的错误来对比输出的信息:
In [4]:
func2(1)
Traceback (most recent call last): File "<ipython-input-4-b2e110f6fc8f>", line 1, in <module> func2(1) File "<ipython-input-1-d849e34d61fb>", line 7, in func2 return func1(a, b) File "<ipython-input-1-d849e34d61fb>", line 2, in func1 return a / b ZeroDivisionError: integer division or modulo by zero
可以看到,输出的异常信息不但少了很多,而且内容结构也发生了变化,出错语句的上下文将会被直接隐去,仅是标注出了语句本身与其对应的代码行序号。
如果不喜欢这种简单的输出结果,我们也可以在 notebooke 中执行 %xmode Verbose
来还原显示详细异常信息的模式,
In [5]:
%xmode Verbose
Exception reporting mode: Verbose
再次执行上文中引发错误的代码,我们可以发现系统再次输出了那段熟悉而复杂的异常信息:
In [6]:
func2(1)
ZeroDivisionErrorTraceback (most recent call last) <ipython-input-6-b2e110f6fc8f> in <module>() ----> 1 func2(1) global func2 = <function func2 at 0x7fa890d9b410> <ipython-input-1-d849e34d61fb> in func2(x=1) 5 a = x 6 b = x - 1 ----> 7 return func1(a, b) global func1 = <function func1 at 0x7fa890d9b398> a = 1 b = 0 <ipython-input-1-d849e34d61fb> in func1(a=1, b=0) 1 def func1(a, b): ----> 2 return a / b a = 1 b = 0 3 4 def func2(x): 5 a = x ZeroDivisionError: integer division or modulo by zero
接下来,我们简要说明一下%debug
语句的用法:
在错误异常发生时,我们可以运用%debug
来进行代码调试,例如在上文中“分母为零”的异常发生后,执行%debug
将进入直接出错函数func1的调试模式,我们可以在调试模式自带的对话框中输入变量名来查看函数中的变量情况,输入“quit”则退出该模式。
In [7]:
%debug
> <ipython-input-1-d849e34d61fb>(2)func1() 1 def func1(a, b): ----> 2 return a / b 3 4 def func2(x): 5 a = x ipdb> a 1 ipdb> b 0 ipdb> quit
同时,在调试模式下,我们也可以通过输入“up”来对外层函数进行调试,查看其中的变量情况。
In [8]:
%debug
> <ipython-input-1-d849e34d61fb>(2)func1() 1 def func1(a, b): ----> 2 return a / b 3 4 def func2(x): 5 a = x ipdb> up > <ipython-input-1-d849e34d61fb>(7)func2() 3 4 def func2(x): 5 a = x 6 b = x - 1 ----> 7 return func1(a, b) ipdb> x 1 ipdb> quit
另外,在 notebooke 中执行 %pdb on 可以设置为当异常发生时自动进入调试模式,在某些特殊的情况下,这么做可能会更为方便:
In [9]:
%xmode Plain %pdb on func2(1)
Exception reporting mode: Plain Automatic pdb calling has been turned ON
Traceback (most recent call last): File "<ipython-input-9-35491686a29e>", line 3, in <module> func2(1) File "<ipython-input-1-d849e34d61fb>", line 7, in func2 return func1(a, b) File "<ipython-input-1-d849e34d61fb>", line 2, in func1 return a / b ZeroDivisionError: integer division or modulo by zero
> <ipython-input-1-d849e34d61fb>(2)func1() 1 def func1(a, b): ----> 2 return a / b 3 4 def func2(x): 5 a = x ipdb> a 1 ipdb> b 0 ipdb> up > <ipython-input-1-d849e34d61fb>(7)func2() 3 4 def func2(x): 5 a = x 6 b = x - 1 ----> 7 return func1(a, b) ipdb> x 1 ipdb> quit