声明:本内容非盈利性质,也不支持任何组织或个人将其用作盈利用途。本内容来源于参考书或网站,会尽量附上原文链接,并鼓励大家看原文。侵删。
3.2 异常捕捉分支结构
3.2.1 try-except-finally结构
try-except-finally是最基本的异常处理结构。它的具体形式如下:
'''
try:(如果有,则只能有一个)可能出现异常的代码块
except:(可以有多个)如果有异常则执行的代码块
finally:(可以没有,也可以有一个)无论是否有异常都会执行的代码块
'''
使用示例:
'''
捕捉自定义异常
'''
# 自定义异常如下:
class MyException(Exception):def __init__(self, code, message):self.code = codeself.message = messagedef __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 = codeself.message = messagedef __str__(self):return f"{self.code}: {self.message}"def divide(a, b):if b == 0:raise MyException(400, "Division by zero")return a / btry: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 1except: # 被屏蔽如果有异常则执行的代码块return 2else: # 被屏蔽没有异常才会执行的代码块return 3finally: # finally输出return 4 将会覆盖try中的return 1 ,若没有return 4 则输入return 3无论是否有异常都会执行的代码块return 4
'''
使用示例如下:
def divide(a, b):try:result = a / breturn resultexcept Exception: # 实际上想要多分支捕捉异常时,要将小异常写在前面。print("异常了")return 2else: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 / breturn resultexcept Exception: # 实际上想要多分支捕捉异常时,要将小异常写在前面。print("异常了")return 2else:print("保留2位小数是{:.2f}".format(result))finally:print("执行结束")return 4print(divide(10, 0)) # 异常执行,执行except分支,再打印返回值为4;
print(divide(10, 3)) # 正常执行,结果被finally分支刷新为4,打印还是4;