python中的异常捕获、异常处理语句关键字有try、except、else、finally,主要组合如下:
1.不捕获异常,不管是否异常仍要执行操作(finally)
先执行finally中的语句,再抛出异常。
# 不捕获异常,抛出异常后,仍执行finally中的语句
try:
print(1/0)
finally:
print('执行了')
# 执行了
# Traceback (most recent call last):
# File "/Users/xxx/test.py", line 3, in <module>
# print(1/0)
# ZeroDivisionError: division by zero
2.捕获所有的异常(最好不要用)
# 捕获所有的异常
try:
print(1/0)
except:
print('有异常了')
3.捕获指定的异常
捕获一种异常
try:
print(1/0)
except ZeroDivisionError:
print('ZeroDivisionError: division by zero')
同时捕获多种异常(实际上也只是捕获其中的一种,只是可捕获的种类多了)
try:
print(1/0)
print(int('he'))
except (ZeroDivisionError,ValueError) as error:
print(error)
只捕获了ZeroDivisionError异常,输出:'division by zero'
try:
print(12[0])
print(int('he'))
except (ZeroDivisionError,ValueError,TypeError) as error:
print(type(error),'***',error)
捕获了TypeError异常,输出:<class 'TypeError'> *** 'int' object is not subscriptable
4.只在没有异常时执行(else)
try:
print('123')
except (ZeroDivisionError,ValueError,TypeError) as error:
print(type(error),'***',error)
else:
print('没有异常')
5.可捕获异常,不管有没有异常,都要执行(finally)
先执行except下的语句,再执行finally下的语句。
try:
print(1/0)
except (ZeroDivisionError,ValueError,TypeError) as error:
print(type(error),'***',error) # <class 'ZeroDivisionError'> *** division by zero
finally:
print('异常也要执行') # 异常也要执行
6.所有武器齐上阵
def divide(x, y):
try:
result = x / y
except ZeroDivisionError:
print("被除数不能是0")
else:
print("除法结果是:", result)
finally:
print("执行了finally")
当抛出的异常不在可捕获的异常中时,先执行finally中的语句,再抛出异常
divide('234','456')
# 执行了finally
# Traceback (most recent call last):
# File "/Users/menghua/Documents/pythonworkspace/flasktest/test.py", line 11, in <module>
# divide('234','456')
# File "/Users/menghua/Documents/pythonworkspace/flasktest/test.py", line 3, in divide
# result = x / y
# TypeError: unsupported operand type(s) for /: 'str' and 'str'
当抛出的异常被捕获,则先执行except中的语句,再执行finally中的语句
divide(123,0)
# 被除数不能是0
# 执行了finally
没有异常抛出时,先执行else中的语句,再执行finally中的语句
divide(123,12)
# 除法结果是: 10.25
# 执行了finally
7.引发异常raise
先执行except中的语句,再执行finally中的语句
try:
raise ValueError('抛出异常的提示信息,不加参数则只是会捕获异常,不会有提示信息')
except ValueError as error:
print(error) # 抛出异常的提示信息,不加参数则只是会捕获异常,不会有提示信息
else:
print('没有异常')
finally:
print('异常也要执行') # 异常也要执行
ps:以上几种异常处理方式中语句的关键字顺序不可修改。