肉渣教程

错误调试

上一节 下一节

出错的时候

Python脚本运行中,若无错误调试的特殊设置,则运行到出错的代码语句,则程序立即停止,并抛出错误信息。示例如下,当程序运行到print 3 / 0这一句就会抛出异常并终止程序。

print 3 / 1
print 3 / 0
print 3 / -1

运行一下


上述脚本的运行结果如下:

3
Traceback (most recent call last):
  File "/usercode/file.py", line 2, in 
    print 3 / 0
ZeroDivisionError: integer division or modulo by zero

Python程序抛出的错误信息中,会对出错的代码位置、错误的类型等进行简单描述。


try语句 - 错误调试

使用try语句和except语句,可进行异常调试;同时也可以利用这种方法来增强程序的容错性。示例如下:

print 3 / 1

try:
    print 3 / 0
except:
    print "error"

print 3 / -1

运行一下


上述示例代码中,程序运行到print 3 / 0时出现错误,因为是在try语句内出错的,所以不会抛出错误和终止整个程序;而是立刻结束try语句内的程序运行流,并跳转到except语句内的代码块,继续执行程序。

try语句和except语句的使用格式如下:

try:
    代码块1
except:
    代码块2

正常情况下,只会执行代码块1;若代码块1中出现了错误,则立刻结束代码块1的运行,并跳转到except语句内来执行代码块2。简而言之,try语句就是复活甲。复活甲主要两个作用:错误调试、增加程序的容错性。


为了进一步丰富错误调试的功能,还可以配上else语句;若try语句内的代码块1全部正常执行、没有抛出异常;则在代码块1执行完毕后,else语句内的代码块3会被继续执行;一般来说else语句内的代码主要是为了反馈try语句内的代码已成功执行,就好比是except语句内的代码是为了反馈try语句内出现异常。

try:
    代码块1
except:
    代码块2
else:
    代码块3


示例如下:

try:
    print 3 / 0.1
except:
    print "error"
else:
    print "good"

运行一下

异常对象

当Python出错后,就会将错误信息储存到一个对象中去;通常来说,该对象中会含有一段错误信息,以及文件名、行号等信息。

而在单次的错误调试中,可以同时使用多个except语句,根据不同的异常类型,分别进行相应处理。

try:
    代码块1
except 异常类型1:
    代码块2
except 异常类型2:
    代码块3
except:
    代码块4

如上所示,假设代码块1中出现异常,则会从上往下,依次匹配异常类型;如果属于异常类型1,则跳转到代码块2;如果属于异常类型2,则跳转到代码块3;若属于其他异常类型,则跳转执行代码块4。(上述只分了3种情况,实际运用中不必拘泥,按需去搞。)

Python中常用的异常类型如下表所示:

异常类型 异常描述
ZeroDivisionError 数学运算中除数为0
IndexError 超出对象索引范围
KeyError 字典对象中不存在指定的键(key)
NameError 访问一个不存在的变量名
AttributeError 访问的对象属性不存在
SyntaxError 语法错误
TypeError 类型错误
AssertionError assert断言的条件为假


示例如下:

try:
    print 3 / 0
except IndexError:
    print "index error"
except ZeroDivisionError:
    print 'zero division error'
except:
    print "other error"

运行一下


不指定异常类型,即可匹配所有异常;若指定异常类型为“BaseException”,也可匹配全部异常;不过一般大家更习惯使用“Exception”,Exception可以匹配绝大部分异常,但是BaseException比Exception的涵盖面更广一些。


若想将异常对象存储到指定变量中去;格式如下所示,自定义变量就是用来存储异常对象的。

try:
    代码块1
except 异常类型, 自定义变量:
    代码块2

运行一下

raise语句 主动抛出异常

“坦白从宽,抗拒从严”;在过于复杂的程序中,有时会有需求来主动抛出异常。这时就可以使用raise语句来主动抛出异常,还可以自定义异常信息的描述。(不过自定义异常信息是非必要的,可以缺省)

raise 异常类型( 自定义异常信息 )


示例如下:

try:
    raise IndexError( "This is an example of raising error." )
    print 3 / 0
except IndexError, e:
    print e
except ZeroDivisionError:
    print 'zero division error'
except:
    print "other error"

运行一下

assert断言 根据条件主动抛出异常

assert语句一般被称作断言,断言的条件如果是真,则无异常,继续执行;若断言的条件为假,则主动抛出AssertionError。

assert( 条件 )assert 条件


示例如下:

>>> assert( True )
>>> assert( False )
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError
>>> assert( 1 > 2 )
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError

运行一下


错误调试

上一节 下一节