声明:本内容非盈利性质,也不支持任何组织或个人将其用作盈利用途。本内容来源于参考书或网站,会尽量附上原文链接,并鼓励大家看原文。侵删。
3.2 异常捕捉分支结构
3.2.1 try-except-finally结构
try-except-finally是最基本的异常处理结构。它的具体形式如下:
'''
try:(如果有,则只能有一个)
可能出现异常的代码块
except:(可以有多个)
如果有异常则执行的代码块
finally:(可以没有,也可以有一个)
无论是否有异常都会执行的代码块
'''
使用示例:
'''
捕捉自定义异常
'''
# 自定义异常如下:
class MyException(Exception):
def __init__(self, code, message):
self.code = code
self.message = message
def __str__(self):
return f"{self.code}: {self.message}"
# 自定义一个除法函数如下:
def divide(a, b):
if b == 0:
raise MyException(400, "Division by zero")
return a / b
# try-except异常捕捉如下:
try:
result = divide(4, 0)
except MyException:
print("输入参数有误") # 异常下可以打印自定义信息
try:
result = divide(4, 0)
except MyException as e:
print(e) # 也可以输出
# try-except-finally异常捕捉:
try:
result = divide(4, 0)
except MyException as e:
print(e)
finally:
print("执行结束")
# try-except(多个)-finally异常捕捉:
try:
result = divide(4, 0)
except Exception: # 无论是父类异常在前,还是子类异常在前,只要执行到一个except分支就不会再执行后面的except分支了。但是如果像这样父类异常在前,后在的except分支将是永远也执行不到的。
print("出现异常了")
except MyException as e:
print(e)
finally:
print("执行结束")
try:
result = divide(4, 0)
except MyException as e: # 实际上想要多分支捕捉异常时,要将小异常写在前面。
print(e)
except Exception:
print("出现异常了")
finally:
print("执行结束")
try:
result = divide(4, 0)
except TypeError:
print("类型错误")
except Exception: # 如果之前的except分支没生效,才能执行到这个后面的except分支
print("出现异常了")
finally:
print("执行结束")
3.2.2 try-except-else-finally结构
try-except-else-finally结构是另一种常用的异常处理形式,else分支主要用来放没有异常时才执行的代码。具体结构如下:
'''
try:(如果有,则只能有一个)
可能出现异常的代码块
except:(可以有多个)
如果有异常则执行的代码块
else:(如果有,则只能有一个)
没有异常才会执行的代码块
finally:(可以没有,也可以有一个)
无论是否有异常都会执行的代码块
'''
使用示例:
class MyException(Exception):
def __init__(self, code, message):
self.code = code
self.message = message
def __str__(self):
return f"{self.code}: {self.message}"
def divide(a, b):
if b == 0:
raise MyException(400, "Division by zero")
return a / b
try:
result = divide(10, 3)
except MyException as e:
print(e)
except Exception:
print("出现异常了")
else: # else分支一定要在所有except分支之后且在finally分支之前,并且只能有一个
print("保留2位小数是{:.2f}".format(result))
finally:
print("执行结束")
3.2.3 函数下带返回值的异常处理
上面的异常处理分支是可以放在函数体的位置的。如果在函数体且没有返回值(即return语句),则情况与上面是一样的;如果在函数体且有返回值,则有需要注意的地方。
函数下带返回值的异常处理的具体形式如下:
'''
def func():
try: # 如果try正常返回,则由于函数中止会将后续except与else中的代码屏蔽,但finally中的代码不会被屏蔽;
可能出现异常的代码块
return 1
except: # 被屏蔽
如果有异常则执行的代码块
return 2
else: # 被屏蔽
没有异常才会执行的代码块
return 3
finally: # finally输出return 4 将会覆盖try中的return 1 ,若没有return 4 则输入return 3
无论是否有异常都会执行的代码块
return 4
'''
使用示例如下:
def divide(a, b):
try:
result = a / b
return result
except Exception: # 实际上想要多分支捕捉异常时,要将小异常写在前面。
print("异常了")
return 2
else:
print("保留2位小数是{:.2f}".format(result))
finally:
print("执行结束")
print(divide(10, 0)) # 如果try分支是有异常的,则正常执行except和finally分支
print(divide(10, 3)) # 如果try分支是正常返回的,因为有return,所以正常返回后不会执行except和else,所以打印结果是没有保留两位小数的
# 如果finally分支是有返回值的,则无论正常或异常执行,最终都返回finally中的return结果
def divide(a, b):
try:
result = a / b
return result
except Exception: # 实际上想要多分支捕捉异常时,要将小异常写在前面。
print("异常了")
return 2
else:
print("保留2位小数是{:.2f}".format(result))
finally:
print("执行结束")
return 4
print(divide(10, 0)) # 异常执行,执行except分支,再打印返回值为4;
print(divide(10, 3)) # 正常执行,结果被finally分支刷新为4,打印还是4;