57.异常处理
1)案例实践
>>> my_list=['xiaojiau']
>>> assert len(my_list)>0
>>> my_list.pop()
'xiaojiau'
>>> my_list
[]
>>> assert len(my_list)>0
Traceback (most recent call last):
File "", line 1, in
assert len(my_list)>0
AssertionError
>>> my_list.fishc
Traceback (most recent call last):
File "", line 1, in
my_list.fishc
AttributeError: 'list' object has no attribute 'fishc'
>>> my_list=[1,2,3]
>>> mylist[3]
Traceback (most recent call last):
File "", line 1, in
mylist[3]
NameError: name 'mylist' is not defined
>>> my_list[3]
Traceback (most recent call last):
File "", line 1, in
my_list[3]
IndexError: list index out of range
>>> my_dict={'one':1,'two':2,'there':3}
>>> my_dict['one']
1
>>> my_dict['four']
Traceback (most recent call last):
File "", line 1, in
my_dict['four']
KeyError: 'four'
>>> my_dict.get('four')
>>> my_dict
{'two': 2, 'there': 3, 'one': 1}
>>> my_dict.get('four',4)
4
>>> my_dict
{'two': 2, 'there': 3, 'one': 1}
>>> print 'ilove'
SyntaxError: Missing parentheses in call to 'print'
>>> 1_'1'
SyntaxError: invalid syntax
>>> 1+'1'
Traceback (most recent call last):
File "", line 1, in
1+'1'
TypeError: unsupported operand type(s) for +: 'int' and 'str'
>>> 3/0
Traceback (most recent call last):
File "", line 1, in
3/0
ZeroDivisionError: division by zero
>>>
2)标准异常
3)监测和处理异常
【1】try-except语句
try:
检测范围
except Exception[as reason]:
出现异常(Exception)后的处理代码
实例:
1)打开一个文件并打印其中内容
f=open('我为什么是一个文件.txt')
print(f.read())
f.close()
2)当运行该脚本时候,如果文件不存在系统应该会抛出异常
>>>
================= RESTART: C:/Users/yangfei/Desktop/digui.py =================
Traceback (most recent call last):
File "C:/Users/yangfei/Desktop/digui.py", line 1, in
f=open('我为什么是一个文件.txt')
FileNotFoundError: [Errno 2] No such file or directory: '我为什么是一个文件.txt'
3)修改原脚本代码以便捕获异常
try:
f=open('我为什么是一个文件.txt')
print(f.read())
f.close()
except OSError:
print('文件出错啦/(ㄒoㄒ)')
4)运行添加了捕获异常代码的优化脚本后如下
>>>
================= RESTART: C:/Users/yangfei/Desktop/digui.py =================
文件出错啦/(ㄒoㄒ)
5)继续优化代码脚本,连同异常原因都打印出来
try:
f=open('我为什么是一个文件.txt')
print(f.read())
f.close()
except OSError as reason: #reason是一个变量名,此处可以自己起任何名称
print('文件出错啦/(ㄒoㄒ)\n错误原因是:'+str(reason)) #reason一定需要str化后才能输出
6)运行5)中优化后的脚本如下
>>>
================= RESTART: C:/Users/yangfei/Desktop/digui.py =================
文件出错啦/(ㄒoㄒ)
错误原因是:[Errno 2] No such file or directory: '我为什么是一个文件.txt'
7)try语句中含有多个错误时候的捕获和处理:
try:
sum=1+'1' #这里会报类型错误
f=open('我为什么是一个文件.txt') #这里汇报os错误
print(f.read())
f.close()
except TypeError as reason1: #这里为了捕获到类型错误后去处理类型错误
print('类型错误啦\n错误原因是:'+str(reason1))
except OSError as reason2: #这里为了捕获到os错误后去处理os错误
print('文件出错啦/(ㄒoㄒ)\n错误原因是:'+str(reason2))
8)运行7)中语句,ty块中先被捕获的异常先进行错误处理,之后代码中断,之后代码中的异常则不会再被捕获出来
>>>
================= RESTART: C:/Users/yangfei/Desktop/digui.py =================
类型错误啦
错误原因是:unsupported operand type(s) for +: 'int' and 'str'
9)若try块中有异常没有被except设置捕获:
try:
int(abc) #这个异常是valueerror,没有被except捕获
sum=1+'1'
f=open('我为什么是一个文件.txt')
print(f.read())
f.close()
except TypeError as reason1:
print('类型错误啦\n错误原因是:'+str(reason1))
except OSError as reason2:
print('文件出错啦/(ㄒoㄒ)\n错误原因是:'+str(reason2))
10)运行9)后如下:
>>>
================= RESTART: C:/Users/yangfei/Desktop/digui.py =================
Traceback (most recent call last):
File "C:/Users/yangfei/Desktop/digui.py", line 2, in
int(abc)
NameError: name 'abc' is not defined
11)如果想要捕获try块中任何异常并给用户以反馈则可以如下优化脚本:
try:
int(abc)
sum=1+'1'
f=open('我为什么是一个文件.txt')
print(f.read())
f.close()
except:
print('出错啦')
12)运行11)如下
>>>
================= RESTART: C:/Users/yangfei/Desktop/digui.py =================
出错啦
12)同时捕获多个异常:
try:
sum=1+'1'
f=open('我为什么是一个文件.txt')
print(f.read())
f.close()
except (TypeError,OSError):
print('出错啦')
13)运行12)中同时捕获多个异常的脚本:
>>>
================= RESTART: C:/Users/yangfei/Desktop/digui.py =================
出错啦
【2】try-finally语句
try:
检测范围
except Exception[as reason]:
出现异常(Exception)后处理代码
finally:
无论如何都会被执行的代码
1)生成并写入内容一个文件
>>> f=open('我为什么是一个文件.txt','w')
>>> f.write('hahahahaha')
10
>>> f.close()
>>> f=open('我为什么是一个文件.txt')
>>> f.read()
'hahahahaha'
2)当打开文件没有错误,但是关闭文件之前出错
try:
f=open('我为什么是一个文件.txt')
print(f.read())
sum=1+'1'
f.close()
except (TypeError,OSError):
print('出错啦')
3)运行2)中语句如下
>>>
================= RESTART: C:/Users/yangfei/Desktop/digui.py =================
hahahahaha
出错啦
4)此时尝试往“我为什么是一个文件.txt“这个文件中写入文本如下:因为上次没有关闭
>>> f=open('我为什么是一个文件.txt','w')
>>> f.write('isisisi')
7
去看看文件中是啥
>>> f.close()
>>> f.read()
Traceback (most recent call last):
File "", line 1, in
f.read()
ValueError: I/O operation on closed file.
5)优化异常捕获代码,增加无论异常如何,捕获后都要进行的finally
try:
f=open('我为什么是一个文件.txt')
print(f.read())
sum=1+'1'
f.close()
except (TypeError,OSError):
print('出错啦')
finally:
f.close()
6)运行5)代码:但此时文件被finally顺利关闭
>>>
================= RESTART: C:/Users/yangfei/Desktop/digui.py =================
hahahahaha
出错啦
【3】raise语句,引发异常:
>>> 1/0
Traceback (most recent call last):
File "", line 1, in
1/0
ZeroDivisionError: division by zero
>>> raise ZeroDivisionError
Traceback (most recent call last):
File "", line 1, in
raise ZeroDivisionError
ZeroDivisionError
>>> raise ZeroDivisionError('除数为0的异常')
Traceback (most recent call last):
File "", line 1, in
raise ZeroDivisionError('除数为0的异常')
ZeroDivisionError: 除数为0的异常