写在之前
在昨天的文章(零基础学习 Python 之错误 & 异常)中我介绍了 Python 中「错误 & 异常」的概念,如果在程序运行过程中抛出了异常,程序就会中止运行。这样的程序不是「健壮」的,健壮的程序应该不被各种异常所击倒。
所以,程序出现了异常就要「处理异常」。
处理异常
首先,让我们先来看一段代码:
while True:
print('this is a division program.')
a = input("input 'a' continue,otherwise logout:")
if a == 'a':
x = input('first number')
y = input('second number')
try:
print(float(x)/float(y))
print('***************')
except ZeroDivisionError:
print('the second number can not be zero.')
print('***********************************')
else:
break
运行上面的代码,显示的结果如下:
this is a division program.
input 'a' continue,otherwise logout:a
first number5
second number2
2.5
***************
this is a division program.
input 'a' continue,otherwise logout:a
first number5
second number0
the second number can not be zero.
***********************************
this is a division program.
input 'a' continue,otherwise logout:b
从运行的情况来看,当在第 2 个数,即除数为 0 时,程序并没有因为这个错误而停止,而是给了一个很友好的提示,让我们有机会改正错误,这完全得益于「异常处理」的设置,如果没有处理异常的机制,当异常出现的时候程序就会中止。
1.try...except...
对于上面的例子,只看到了 try 和 except 部分,如果没有异常发生的话,except 在 try 执行后被忽略;如果 try 子句中有异常的话,则该部分的其它子句被忽略,直接跳到 except 部分,执行其后面指定的异常类型及其子句。
except 后面也可以没有任何异常类型,即无异常参数。如何这样的话,不论 try 部分发生什么异常,都会执行 except。
2.处理多个异常
try...except... 是处理异常的基本方式,在此基础上,还可以扩展,也就是能够处理多个异常。
这里所说的处理多个异常,并不是因为同时报出多个异常,而是程序在运行中,只要遇到一个异常就会反应,所以每次捕捉到的异常一定是一个,由不同的 except 子句处理。
3. else 子句
其实有了 try...except...,在一般情况下是够用的,但怕就怕在总有不一般的情况出现,所以就增加一个 else 子句,这个其实就和我们说的话一样,总要根据需要添加不少东西。
try:
print('just try')
except:
print('just except')
else:
print('i am else')
上述代码的运行结果如下:
just try
i am else
上述代码能够帮助我们理解 else 的执行特点:如果 try 被执行了,则 except 被忽略,但是 else 被执行。然后我们在来看下面的代码:
try:
print(1/0)
except:
print('just except')
else:
print('i am else')
上述代码的运行结果如下:
just except
这个时候,else 就不被执行了,两个例子帮助我们了解了 else 的执行特点。
4.finally
finally 子句,一看这个名字,就感觉这是做善后工作的。的确如此,如果有了 finally ,不管前面执行的是 try 还是 except,最终都要执行它。因此,有一种说法是将 finally 用在可能的异常后进行清理,请看下面的例子:
x = 10
try:
x = 1 / 0
except Exception as e:
print(e)
finally:
print(e)
del x
上述代码的运行结果如下:
integer division or modulo by zero
del x
我们来看一看 x 是否被删除:
>>> x
Traceback (most recent call last):
File "test_search.py", line 1, in <module>
print(x)
NameError: name 'x' is not defined
当然,在应用里面可以将上面的各个句子综合起来使用,写成下面这样:
try:
do something
except:
do something
else:
do something
finally:
do something
写在最后
异常处理到这就写完了,基本上所有的都在这了,明天是「错误 & 异常」的一个扩展知识点 -- 「断言」,敬请期待。
如果你觉得今天的文章对你有所帮助的话,欢迎点赞转发,谢谢支持。
The end。