2.2.2 Python异常的处理

对于Python运行当中,遇到异常Python是怎么显示和处理的:
#!/usr/bin/env python
#coding=utf-8

while True:
print "这是数据输入入口。"
a = raw_input("继续请输入:true,其他输入退出:")
if a == 'true':
b = raw_input("第一个数:")
c = raw_input("第二个数:")
try :
print float(b)/float(c)
except ZeroDivisionError: #异常处理
print "被除数为0"
else:
break
运行结果:
>>>
这是数据输入入口。
继续请输入:true,其他输入退出:true
第一个数:3
第二个数:6
0.5
这是数据输入入口。
继续请输入:true,其他输入退出:true
第一个数:2
第二个数:0
被除数为0
这是数据输入入口。
继续请输入:true,其他输入退出:a
>>>
从结果来看,当第二次输入时抛出异常了,但是层序并没有停止运行,给个错误的提示,继续运行;这就是异常处理的好处,要是没有异常处理,这里就会直接停止了。
1, try...except...
上面程序可以看到使用的事try...except...来处理异常,当正常运行的时候,执行完try之后,自动忽略except;当发生异常时,try里异常之后的代码自动忽略,直接跳到except。
#!/usr/bin/env python
#coding=utf-8

class Test(object):
a = False
def cach(self,ex):
try :
return eval(ex) #eval的含义就是计算运算式
except ZeroDivisionError:
if self.a:
print "0 can not be division"
else:
raise #它的含义是将异常信息抛出

if __name__ == "__main__":
t = Test()
print t.cach("1/0")
运行结果:
>>>
Traceback (most recent call last):
File "D:/1.py", line 17, in <module>
print t.cach("1/0")
File "D:/1.py", line 8, in cach
return eval(ex)
File "<string>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
当改变main函数:
if __name__ == "__main__":
t = Test()
t.a = True
print t.cach("1/0")
结果:
>>>
0 can not be division
None
最后的None是t.cach("1/0")的返回值,因为有 print t.cach("1/0"),所以被打印出来。
2, 多个异常处理
#!/usr/bin/env python
#coding=utf-8

while True:
print "这是数据输入入口。"
a = raw_input("继续请输入:true,其他输入退出:")
if a == 'true':
b = raw_input("第一个数:")
c = raw_input("第二个数:")
try :
print float(b)/float(c)
except ZeroDivisionError: #异常处理
print "被除数为0"
except ValueError:
print "请输入一个数字."
else:
break
增加了一个except子句,目的是当用户输入的不是数字时,捕获并处理这个异常。
>>>
这是数据输入入口。
继续请输入:true,其他输入退出:true
第一个数:3
第二个数:0
被除数为0
这是数据输入入口。
继续请输入:true,其他输入退出:true
第一个数:5
第二个数:hello
请输入一个数字.
这是数据输入入口。
继续请输入:true,其他输入退出:
如果有多个 excepttry里面遇到一个异常,就转到相应的 except子句,其他的忽略。如果 except没有相应的异常,该异常也会抛出,不过这时程序就要中止了
除了用多个except之外,还可以在一个except后面放多个异常参数:
except (ZeroDivisionError, ValueError):
print "请检查输入是否正确"
注意,except后面如果是多个参数,一定要用圆括号包裹起来。
一般出现异常的时候,我们前面都写的是自己的提示语句;但,最好打印系统异常自己的提示语:
#!/usr/bin/env python
#coding=utf-8

while True:
print "这是数据输入入口。"
a = raw_input("继续请输入:true,其他输入退出:")
if a == 'true':
b = raw_input("第一个数:")
c = raw_input("第二个数:")
try :
print float(b)/float(c)
except (ZeroDivisionError, ValueError), e :
print "这是异常自己的提示语:"
print e
else:
break
运行结果:
>>>
这是数据输入入口。
继续请输入:true,其他输入退出:true
第一个数:4
第二个数:0
这是异常自己的提示语:
float division by zero
这是数据输入入口。
继续请输入:true,其他输入退出:a
上面的程序中,只处理了两个异常,还可能有更多的异常,可以这样: execpt:或者 except Exception,e:,后面什么参数也不写就好了。
3, finally子句
finally,通俗的说,就是做善后的。如果有了 finally,不管前面执行的是 try,还是 except,最终都要执行它。
#!/usr/bin/env python
#coding=utf-8
a = True
while a:
x = 5
try :
x = 1/0
except Exception,e:
print e
finally :
print "use x"
x = 6
a = False
运行结果:
>>>
integer division or modulo by zero
use x
>>> x #验证是否执行了finally
6
合理运用tyr..except...finally和if...else是非常有用的。
4, assert断言
>>> assert a==a
>>> assert a==b

Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
assert a==b
NameError: name 'b' is not defined
>>> assert 1==0

Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
assert 1==0
AssertionError
assert,翻译过来是“断言”之意。assert是语句等价于布尔真的判定,发生异常就意味着表达式为假。
程序运行到某个节点的时候,就断定某个变量的值必然是什么,或者对象必然拥有某个属性等,简单说就是断定什么东西必然是什么,如果不是,就抛出错误。
什么时候适合断言:
防御性的编程。
运行时对程序逻辑的检测。
合约性检查(比如前置条件,后置条件)。
程序中的常量。
检查文档。
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值