您的位置:首页 > 编程语言 > Python开发

Python Jupyter Notebook 中的错误异常与代码调试

2016-10-08 14:57 921 查看
Python Jupyter Notebook 中的错误异常与代码调试 - Datacademy 数析学院 | Datartisan http://datacademy.io/lesson/65


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: PlainAutomatic 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: