python语言基础 -- python中异常的捕获及处理(try...except...finally)

异常的介绍

在我们的日常开发中,难免会遇到这样或那样的错误,那么一旦遇到错误如果不去捕获处理掉的话,程序就会终止并退出。想一想假如有个学员信息管理系统,每位学员都有一堆信息需要录入系统中,某个学员的信息已经录入了一半还没保存,这时程序突然出现错误异常退出了,那我们前面的那些工作岂不是白做了。所以这个时候我们就需要捕获到这些异常并把它们处理掉,以保证系统能够运行下去。

那么什么是异常呢?接下来看个小例子

print('---test1---')

open('test.txt')#test.txt文件不存在

print('---test2---')

执行上述代码得到如下结果

---test1---
Traceback (most recent call last):
  File "C:/lyq/lyq.py", line 2, in <module>
    open('test.txt')
FileNotFoundError: [Errno 2] No such file or directory: 'test.txt'

我们看到第一句test1已经打印出来,那么 正常情况下应该接着打印test2,但结果并非我们想象的那样。原因是中间出现了错误,当程序尝试打开一个不存在的文件时,程序就会抛出一个文件找不到的异常,从而导致程序异常结束。

异常:

当python程序遇到一些错误时,解释器无法继续往下执行,并且出现了一些错误提示,从而导致程序终止,这就是所谓的异常。

那么档程序遇到异常时,为了不让程序终止,我们应该怎么做呢?接下来就看一下异常的捕获。

捕获异常try ... except ...

在python语言中用try...except...语句来捕获并处理异常。try需要跟except或finally搭配使用不能单独使用。一般情况下把容易出现错误或可能会出现错误的代码放在try语句中,把一些处理错误的逻辑放在except中。try...except...的原理是try中的代码会先执行,一旦在遇到错误程序就会从错误的那行代码停止,然后跳到except块中执行except中的代码。这就是异常的捕获。

示例代码

try:
    print('---test1---')

    open('test.txt')#test.txt文件不存在

    print('---test2---')

except FileNotFoundError as e:

    print('---test3---')

上述代码运行结果

---test1---
---test3---

我们看到,运行结果输出了test1和test3,而不像第一次执行那样只输出了test1并且还出现了一堆错误。这就是异常处理的好处。

捕获多种异常

在平时的开发中会遇到各种各样类型的异常,比如上面用到的FileNotFoundError,再比如程序中使用了一个未定义的变量,这时会抛出一个NameError的异常等等。针对不同类型的异常需要使用不同的异常类去处理

try:
    print('---test1---')
    print(name)
    open('test.txt')#test.txt文件不存在
    print('---test2---')

except FileNotFoundError:

    print('---test3---')

上面的代码运行结果:

---test1---
Traceback (most recent call last):
  File "C:/lyq/lyq.py", line 3, in <module>
    print(name)
NameError: name 'name' is not defined

又出现了一堆错误,而且跟刚才的还不一样了,这是为什么,我不是加了try...except处理了么。原因就是在处理的时候没有对号入座,这里新出现了一个NameError的异常,而我们程序还是使用的FileNotFoundError去处理的,显然是没有办法捕获和处理的,这时候就需要进行多个异常的捕获和处理了。我们把上面的代码修改一下,再加一个NameError的处理。

try:
    print('---test1---')
    print(name)
    open('test.txt')#test.txt文件不存在
    print('---test2---')

except (FileNotFoundError,NameError):

    print('---test3---')

这样代码又可以正常运行了。在进行多种异常的捕获和处理时,只需把处理异常的多个异常类以元组的形式放在except语句后面即可。

但是这样也有个问题:那么多的异常我们不可能知道所有的异常类也不可能都一一对应上啊,上面又说了必须要对号入座否则即使加了try...except...也不一定能捕获的到啊,那应该怎么办?别急,python早已想到了这些,特此python为我们准备了一个终极大类Exception,这个异常类几乎能捕获到所有类型的异常。用法与其它的一样,这里就不再多说了。

try... except ... finally

在处理异常时还有一个关键字finally,finally也一样跟try或try...except搭配使用。上面说到如果在try中遇到错误,那么程序将会从错误的那行代码停止,并跳进except中执行except中的代码。也就是说在try中错误行后面的代码就执行不到了。这在有些时候也是不合理的,比如在try中打开一个文件进行一些操作然后关闭文件,但恰好在操作文件的过程中出现了异常,导致代码中断文件无法关闭,这其实是很不合理的。所以这个时候就要借助finall关键字。

finally的作用就是:不管程序有没有遇到异常,也就是说不管执行的是try中的代码还是except中的代码,那么最后都要在进入到finally里面再执行一下finally中的代码

在程序中,如果一个段代码必须要执行,即无论异常是否产生都要执行,那么此时就需要使用finally。 比如文件关闭,释放锁,把数据库连接返还给连接池等

try:
    print('---test1---')
    print(name)
    open('test.txt')#test.txt文件不存在
    print('---test2---')

except (FileNotFoundError,NameError):

    print('---test3---')
finally:
    print('不管有没有异常,我都会被执行的')

这里需要说明的是:如果try和finally搭配使用,那么可以不用except关键字,比如有时候只想把异常捕获到而并不想去处理该异常的时候就可以把except省略掉

try ... except ... else

相信大家对else并不陌生,在if中,它的作用是当条件不满足时执行的;同样在try...except...中也是如此,即如果没有捕获到异常,那么就执行else中的逻辑

try:
    num = 100
    print num
except NameError as errorMsg:
    print('产生错误了:%s'%errorMsg)
else:
    print('没有捕获到异常,真高兴')

以上就是关于异常的基本介绍及简单的捕获和处理。关于python中的标准异常类可以参考另一篇文章《python中的标准异常及说明》的详细介绍。

猜你喜欢

转载自blog.csdn.net/lixiaosenlin/article/details/92205602