1. 异常是什么?
异常是一个事件,在程序运行时发生,影响了程序的正常运行 ,我们需要做的是在程序运行时捕获这些异常,以让程序能够继续执行
open('name.txt','r')
---------------------------------------------------------------------------
FileNotFoundError Traceback (most recent call last)
<ipython-input-3-b60a434136cf> in <module>()
----> 1 open('name.txt','r')
FileNotFoundError: [Errno 2] No such file or directory: 'name.txt'
说明:以只读模式打开一个不存在的“name.txt”,这时就会报错。这类错误可以预料到,可以针对这个已经存在的问题进行异常处理,因此这类错误称为异常;而错误则是无法修正,不能进行处理的错误。
2. 异常处理
发生异常
print("---test---1---")
f = open('name.txt','r') # 以只读模式打开一个不存在的文件,这时会报错
print("---test---2---") # 由于出错,这句话就不会执行
---test---1---
---------------------------------------------------------------------------
FileNotFoundError Traceback (most recent call last)
<ipython-input-4-708ad2c1cc05> in <module>()
1 print("---test---1---")
----> 2 f = open('name.txt','r') # 以只读模式打开一个不存在的文件,这时会报错
3 print("---test---2---") # 由于出错,这句话就不会执行
FileNotFoundError: [Errno 2] No such file or directory: 'name.txt'
捕获异常(异常类型欲要捕获,需要一致,即捕获的错误与本身的错误要一致)
try:
print("---test---1---")
f = open('name.txt','r') # 以只读模式打开一个不存在的文件,这时会报错
print("---test---2---") # 由于出错,这句话就不会执行
# FileNotFoundError也是IOError,输入输出异常
except FileNotFoundError: # 捕获到上面出的错误,然后让程序继续运行,但不会报错
pass
---test---1---
多个异常捕获
print(num)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-6-55a60ae9504f> in <module>()
----> 1 print(num)
NameError: name 'num' is not defined
# 未知出的什么类型的错误
try:
print("---test---1---")
f = open('name.txt','r')
print("---test---2---")
print(num)
#以元组的方式将这些错误放在一起即可
except (FileNotFoundError,NameError):
print("出现错误")
---test---1---
出现错误
# 获取错误描述
try:
print("---test---1---")
f = open('name.txt','r')
print("---test---2---")
print(num)
#以元组的方式将这些错误放在一起即可
except (FileNotFoundError,NameError) as error_res:
print("出现错误")
print(error_res) # 一次只报一个错误,先报前面的错误
---test---1---
出现错误
[Errno 2] No such file or directory: 'name.txt'
# 获取所有的异常和描述
try:
print("---test---1---")
f = open('name.txt','r')
print("---test---2---")
print(num)
#以元组的方式将这些错误放在一起即可
except Exception as error_res: # Exception可以承接所有的异常
print("出现错误")
print(error_res) # 一次只报一个错误,先报前面的错误
---test---1---
出现错误
[Errno 2] No such file or directory: 'name.txt'
try…finally与嵌套
# 常规用法
try:
f = open("name.txt","r")
except Exception as res:
print(res)
finally: # 意思是无论如何一定要执行
print("文件关闭")
# f未定义,因为f为局部变量,因此会报错,
# 因此可以将finally写在里面
[Errno 2] No such file or directory: 'name.txt'
文件关闭
try:
f = open("name.txt","r")
except Exception as res:
print(res)
finally: # 意思是无论如何一定要执行
f.close()
print("文件关闭")
# f未定义,因为f为局部变量,因此会报错,
# 因此可以将finally写在里面
[Errno 2] No such file or directory: 'name.txt'
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-11-848ac7990860> in <module>()
4 print(res)
5 finally:
----> 6 f.close()
7 print("文件关闭")
NameError: name 'f' is not defined
# 嵌套用法
import time
try:
f = open("name.txt","r")
try:
while True:
content = f.readline()#读取文件中的一行
if len(content) == 0:
break # 如果为空,则退出
time.sleep(2)# 暂停2s
print(content)
finally: # 意思是无论如何一定要执行
f.close()
print("文件关闭")
except Exception as res:
print(res)
[Errno 2] No such file or directory: 'name.txt'
try:
print("---test---1---")
f = open('name.txt','r') # 以只读模式打开一个不存在的文件,这时会报错
print("---test---2---") # 由于出错,这句话就不会执行
# FileNotFoundError也是IOError,输入输出异常
except FileNotFoundError,s: # 捕获到上面出的错误,然后让程序继续运行,但不会报错
pass
File "<ipython-input-15-df15cce868e3>", line 6
except FileNotFoundError,s: # 捕获到上面出的错误,然后让程序继续运行,但不会报错
^
SyntaxError: invalid syntax
抛出异常
x = 10
if x > 5:
raise Exception('x 不能大于 5。x 的值为: {}'.format(x))
---------------------------------------------------------------------------
Exception Traceback (most recent call last)
<ipython-input-17-e00bf68fb93c> in <module>()
1 x = 10
2 if x > 5:
----> 3 raise Exception('x 不能大于 5。x 的值为: {}'.format(x))
Exception: x 不能大于 5。x 的值为: 10
# 如果只想知道这是否抛出了一个异常,并不想去处理它,
# 那么一个简单的 raise 语句就可以再次把它抛出。
try:
raise NameError('HiThere')
except NameError:
print('An exception flew by!')
raise
An exception flew by!
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-20-bf6ef4926f8c> in <module>()
1 try:
----> 2 raise NameError('HiThere')
3 except NameError:
4 print('An exception flew by!')
5 raise
NameError: HiThere