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语句和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 异常类型( 自定义异常信息 )
示例如下:
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语句一般被称作断言,断言的条件如果是真,则无异常,继续执行;若断言的条件为假,则主动抛出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