在前面的学习中我们经常会产生狠多错误,比如:变量名没定义,错误的调用,等等,有些错误在程序当中我们必须正视修改过来,但是有些错误则需要我们能让程序继续运行下去,例如:存储错误,互联网请求错误,等等python3有一套准们针对错误机制语句来帮助我们处理错误。
本身python3就会有异常处理的返回机制,比如除零错误
>>>1/0
traceback (most recent call last):
file , line 1, in
zerodivisionerror: pision by zero
traceback是回溯的意思也就是找到一个错误发生的地方,在第几行的那个模块中,这里我们返回的错误名称是zerodivisionerror除零错误,给出的解释就是除以零。实际上每个异常都是一个类这个例子是zerodivisionerror的实例,并且有很多种方法可以进行捕捉,使程序对捕捉的错误进行处理而不是中断程序的运行。
错误是可以用try except finally来处理,当程序遇到一些可以可能预见的错误时我们可以有这一机制来处理
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
try:
print('try...')
x = int(input('enter number'))
y = 1 / x
print('result:', y)
except zerodivisionerror as e:
print('except:', e)
finally:
print('finally...')
print('end')
编写一个捕捉错误的代码,首先先用try:将可能产生错误的代码范围框住,然后是程序呢代码,这里我安排了一个我安排了一个自行输入除数有可能除数为零的代码,如果产生错误则跳至代码块except模块except zerodivisionerror as e:这句的意思是,如果产生了异常,并且这个异常是zerodivisionerror时,把zerodivisionerror类里面的错误解释用as关键字实例化给e,然后在进行打印,最后如果有finally语句块则执行这个语句块.
d\text>python error.py
try...
enter number1
result: 1.0
finally...
end
enter number0
except: pision by zero
可以看到,触发了异常之后打印异常然后继续运行程序。
如果有多个错误处理的话我们可以把上面的代码再做修改
except valueerror as e:
print('except',e)
print(type(e))
这个例子中我们在输入时输入一个字符,系统就会抛出一个valueerror错误,同样我们用except捕捉到再打印出来,多重错误判断及捕获可以用以上方法。
使用try...except捕获错误还有一个巨大的好处,就是可以跨越多层调用,比如函数main()调用foo(),foo()调用bar(),结果bar()出错了,这时,只要main()捕获到了,也就是说不需要在每个可能出现错误的地方用try except,只要在合适的层次写上即可
不过既然错误信息一种类我们也可以自己来定义一个错误类
class selferror(valueerror):
pass
def foo(s):
n = int(s)
if n==0:
raise selferror('invalid value: %s' % s)
return 10 / n
自己定义的错误类class selferror(valueerror):
在s =0的时候可以触发,触发引入错误类时用关键字raise
raise语句如果不带参数,就会把当前错误原样抛出。此外,在except中raise一个error,还可以把一种类型的错误转化成另一种类型:
10 / 0
except zerodivisionerror:
raise valueerror('input error!')
以上代码中本身已经有捕获到zerodivisionerror错误了,但是 raise valueerror把这个错误强行转换成了valueerror并且错误信息为'input error!