异常:
当Python检测到⼀个错误时,解释器就⽆法继续执⾏了,会出现⼀些错误的提示,这就是所谓的"异常"。
看如下示例:
print('-----test--1---')
open('123.txt','r')
print('-----test--2---')
打开⼀个不存在的⽂件123.txt,当找不到123.txt ⽂件时,就会抛出给我们⼀个IOError类型的错误,No such file or directory:123.txt (没有123.txt这样的⽂件或⽬录)
异常处理
1. 捕获异常 try...except...
看如下示例:
try:
print('-----test--1---')
open('123.txt','r')
print('-----test--2---')
except IOError:
pass
说明:
- 此程序看不到任何错误,因为⽤except 捕获到了IOError异常,并添加了处理的⽅法
- pass 表示实现了相应的实现,但什么也不做;如果把pass改为print语句,那么就会输出其他信息
⼩总结:
- 把可能出现问题的代码,放在try中
- 把处理异常的代码,放在except中
2. except捕获多个异常
看如下示例:
try:
print num
except IOError:
print('产⽣错误了')
想⼀想: 上例程序,已经使⽤except来捕获异常了,为什么还会看到错误的信息提示?
- 答: except捕获的错误类型是IOError,⽽此时程序产⽣的异常为 NameError ,所以except没有⽣效
修改后的代码为:
try:
print(num)
except NameError:
print('产⽣错误了')
实际开发中,捕获多个异常的⽅式,如下:
try:
print('-----test--1---')
open('123.txt','r') # 如果123.txt⽂件不存在,那么会产⽣ IOError 异常
print('-----test--2---')
print(num)# 如果num变量没有定义,那么会产⽣ NameError 异常
except (IOError,NameError):
# 如果想通过⼀次except捕获到多个异常可以⽤⼀个元组的⽅式
注意:
- 当捕获多个异常时,可以把要捕获的异常的名字,放到except 后,并使⽤元组的⽅式仅进⾏存储
3. 获取异常的信息描述
4. 捕获所有异常
5. else
咱们应该对 else 并不陌⽣,在if中,它的作⽤是当条件不满⾜时执⾏的实⾏;同样在try...except...中也是如此,即如果没有捕获到异常,那么就执⾏else中的事情。
try:
num = 100
print num
except NameError as errorMsg:
print('产⽣错误了:%s'%errorMsg)
else:
print('没有捕获到异常,真⾼兴')
运行结果如下:
6. try...finally...
⽆论异常是否产⽣都要执⾏
,那么此时就需要使⽤finally。如⽂件关闭,释放锁,把数据库连接返还给连接池等。
demo:
import time
try:
f = open('test.txt')
try:
while True:
content = f.readline()
if len(content) == 0:
break
time.sleep(2)
print(content)
except:
#如果在读取⽂件的过程中,产⽣了异常,那么就会捕获到
#⽐如 按下了 ctrl+c
pass
finally:
f.close()
print('关闭⽂件')
except:
print("没有这个⽂件")
说明:
test.txt⽂件中每⼀⾏数据打印,但是我有意在每打印⼀⾏之前⽤time.sleep⽅法暂停2秒钟。这样做的原因是让程序运⾏得慢⼀些。在程序运⾏的时候,按Ctrl+c中断(取消)程序。
可以观察到KeyboardInterrupt异常被触发,程序退出。但是在程序退出之前,finally从句仍然被执⾏,把⽂件关闭。
异常的传递
1. try嵌套中
import time
try:
f = open('test.txt')
try:
while True:
content = f.readline()
if len(content) == 0:
break
time.sleep(2)
print(content)
finally:
f.close()
print('关闭⽂件')
except:
print("没有这个⽂件")
运⾏结果:
^C关闭⽂件
没有这个⽂件
总结:
- try嵌套时,如果⾥⾯的try没有捕获到这个异常,那么外⾯的try会接收到这个异常,然后进⾏处理。
- 如果外边的try依然没有捕获到,那么再进⾏传递。。。
2. 函数嵌套调⽤中
def test1():
print("----test1-1----")
print(num)
print("----test1-2----")
def test2():
try:
print("----test2-1----")
test1()
print("----test2-2----")
except:
print("test2出现异常")
print("----test2-3----")
test2()
print("------华丽的分割线-----")
总结
:
如果try嵌套,那么如果⾥⾯的try没有捕获到这个异常,那么外⾯的try会接收到这个异常,然后进⾏处理,如果外边的try依然没有捕获到,那么再进⾏传递。。。
如果⼀个异常是在⼀个函数中产⽣的,例如函数A---->函数B---->函数C,⽽异常是在函数C中产⽣的,那么如果函数C中没有对这个异常进⾏处理,那么这个异常会传递到函数B中,如果函数B有异常处理那么就会按照函数B的处理⽅式进⾏执⾏;如果函数B也没有异常处理,那么这个异常会继续传递,以此类推。。。如果所有的函数都没有处理,那么此时就会进⾏异常的默认处理,即通常到的那样。
抛出自定义的异常
可以⽤
raise语句来引发⼀个异常
。异常/错误对象必须有⼀个名字,且它们应是Error或Exception类的⼦类。
下⾯是⼀个引发异常的例⼦:
class ShortInputException(Exception):
'''⾃定义的异常类'''
def __init__(self, length, atleast):
#super().__init__()
self.length = length
self.atleast = atleast
def main():
try:
s = input('请输⼊ --> ')
if len(s) < 3:
# raise引发⼀个你定义的异常
raise ShortInputException(len(s), 3)
except ShortInputException as result: #x这个变量被绑定到了错误的实例
print('ShortInputException: 输⼊的度是 %d,度⾄少应是 %d'% (result.length, result.atleast))
else:
print('没有异常发⽣.')
main()
Python更多:https://blog.csdn.net/Scrat_Kong/article/details/90257118