夜光序言:
我于昨晚去世,走时心如止水。
我于今早重生,来时心怀暖阳。
正文:
3.5 函数与异常
3.5.1 目标
程序中这里可能发生异常那里也可能发生异常,那么是不是有可能发生异常的地方都使用 try 异常处理语句进行异常扑捉呢?如果这样的化程序太复杂,实际上异常有传递机制,就是一个地方发生的异常如果没有被扑捉处理的话,它可以一层层传递,一直到被扑捉为止。
目标就是掌握异常的这种传递机制,编写合理的处理程序。
3.5.2 异常处理
在 Python 中如果一个函数抛出一个异常,那么在调用函数的地方可以捕捉到这个异常。
例 3-5-1: 函数的异常扑捉
def fun():
print("start")
n=1/0
print("end")
try:
fun()
except Exception as err:
print(err)
执行该程序结果:
start
division by zero
由此可见 fun 函数中出现的异常在主程序调用 fun 时可以捕捉到,Python 程序一个地方出现异常,那么异常会传递到上一级调用的地方,这个过程会一直传递下去,直到异常被扑捉到为止,如果整个过程都没有遇到扑捉语句,程序就会因异常而结束。因此如果在 fun 中已经捕捉了异常,那么调用的主程序位置就捕捉不到了。
例 3-5-2: 函数的异常扑捉
def fun():
print("start")
try:
n=1/0
print("end")
except:
print("error")
try:
fun()
except Exception as err:
print(err)
程序执行结果:
start
error
例 3-5-3:异常的传递
def A():
print("start A")
n=1/0
print("end A")
def B():
print("start B")
A()
print("end B")
try:
B()
print("done")
except Exception as err:
print(err)
print("finish")
程序执行结果:
start B
start A
division by zero
finish
由此可见函数 A 中出现的异常自己没有捕捉,在调用函数 B 中也没有捕捉,最后在主程序中被捕捉到,即异常有传递性,在一个函数中没有被捕捉的异常会传递给调用这个函数的另外函数,这个过程会一直传递下去,直到异常被捕捉为止,就不再往后传递了。
例 3-5-4:异常的传递
def A():
print("start A")
n=1/0
print("end A")
def B():
print("start B")
try:
A()
except Exception as err:
print(err)
print("end B")
try:
B()
print("done")
except Exception as err:
print(err)
print("finish")
程序结果:
start B
start A
division by zero
end B
done
finish
如果出现的异常一直没有被捕获,那么就传递到系统,程序就会终止。
例 3-5-5:异常终止程序
def A():
print("start A")
n=1/0
print("end A")
def B():
print("start B")
A()
print("end B")
B()
print("finish")
执行结果:
start B
Traceback (most recent call last):
start A
File "C:/untitled/mmm.py", line 13, in <module>
B()
File "C:/untitled/mmm.py", line 9, in B
A()
File "C:/untitled/mmm.py", line 3, in A
n = 1 / 0
ZeroDivisionError: division by zero
3.5.3 【案例】时间的输入与显示
1、案例描述
输入一个有效的时间,并显示该时间。
2、案例分析
设置时间格式为 h:m:s,输入时保证输入且 h、m、s 的值有效,不然就抛出异常。
3、案例代码
def myTime():
h=input("时:")
h=int(h)
if h<0 or h>23:
raise Exception("无效的时")
m=input("分:")
m=int(m)
if m<0 or m>59:
raise Exception("无效的分")
s=input("秒:")
s=int(s)
if s<0 or s>59:
raise Exception("无效的秒")
print("%02d:%02d:%02d" %(h,m,s))
try:
myTime()
except Exception as e:
print(e)
执行时如果时间输入正确,就显示该时间,例如:
时:23
分:12
秒:34
23:12:34
但是如果输入的时间不对,就抛出异常,例如:
时:24
无效的时