想必到现在经过python基础的学习之后,小伙伴们都已经开始写很多脚本了,有大的有小的,但是有的时候并不是所写的能够顺利跑出结果来,期间会有不但的报错以及异常,很多我们都不理解,所以也就不会修改,这是写脚本中常遇到的问题,虽然在当时被定型为绊脚石,但是多次遇到异常后我们会发现这是一笔不可多得的财富。对个人的成长有很大的帮助。


今天呢,我们总结了一下经常遇到的异常报错,以及处理方式。

常见异常类型及描述


那么既然知道了以上的所有报错,我们得知道怎么处理吧,接下来要说的异常报错的处理。


异常处理:捕捉异常

raise语句:

格式:

raise [exceptionType[,argument][,traceback]]

为了调用raise,可以用一个类或者实例的参数来调用。

try/except 语句:

我们先用一个例子来分析这个问题。

首先在交互界面,我们可以按下面输入并得出,10除以2等于5,但是当你10除以0的时候,就会报错ZeroDivisionError,这个我们可以理解,按照数学中定义,分母不可以为0。(除非你不知道。如果真不知道的话,你最好找你小学数学老师谈谈心!)

>>> 10//2
5
>>> 10//0
Traceback (most recent call last):
File "", line 1, in 
10//0
ZeroDivisionError: integer division or modulo by zero

那么问题来了,当你的程序会循环不断的得出数据,总共10000组吧,但是其中第4000多组的数据,有个分母为0的,就会报错,你的整个程序就会终止,导致你得不到你需要的数据,遇到这种情况了改怎么办?

拿就需要用到try/except了,遇到报错可以让程序按照你的要求输出内容并且程序不会终止。别着急,先看代码!

try:
x = raw_input('enter the first number: ')
y = raw_input('enter the second number: ')
print int(x) / int(y)
except ZeroDivisionError:
print "the second number can not be zero!"
except ValueError:
print 'Invalid input ,pls try again.'
输出结果:
enter the first number: 10
enter the second number: 2
5
enter the first number: 10
enter the second number: 0
the second number can not be zero!
enter the first number: 10
enter the second number: ww
Invalid input ,pls try again.

对,你没看错,分母为0 甚至随便写个字母,程序都不会报错,而且都会按照你设定的输出来显示,这个逻辑很有用,是你写程序路上的一种捷径!

try/except +else语句 或者 +finally子句.

try:
1/0
except NameError:
print "Unknown variable"
else:
print "That went well"
finally:
print "clean up."

输出结果:

clean up.
Traceback (most recent call last):
File "C:\Users\xdong\Desktop\tiaojian.py", line 2, in 
1/0
ZeroDivisionError: integer division or modulo by zero

当然try/except else finally是可以卸载一起也可以分开来写,没有必要死按照上文的例子来那样子写,灵活一点。

上例子是finally子句肯定会被执行,不管try子句是否发生异常,在程序崩溃之前。其实finally 已经run 完了。

定义异常:

如果你发现以上没有你需要的异常类型,你可以自己尝试着自己定义异常,满足自己的需求。

classNetworkerror(RuntimeError):
def __init__(self, arg):
self.args = arg
try:
raiseNetworkerror("Bad hostname")
exceptNetworkerror,e:
print e.args


全文总结:

最后我们总结一下全文所说的异常类型用法,可能会给你一个清晰明了的认识。

格式1

try:

正常的操作

except:

发生异常,执行这块代码

else:

如果没有异常执行这块代码

格式2

try:

正常的操作

except(Exception1[,Exception2[,...ExceptionN]]]):

发生以上多个异常中的一个,执行这块代码

else:

如果没有异常执行这块代码

格式3

try:
finally:
#退出try时总会执行
raise