Python异常处理机制详解:从基础捕获到完整流程控制
本文深入解析Python中的异常处理机制,涵盖单异常捕获、多异常匹配、Exception通用捕获及主动触发异常(raise)的使用方法。重点讲解try...except...else...finally的完整执行逻辑,通过具体代码示例展示如何定义自定义异常类、处理不匹配异常以及确保清理代码的执行,帮助开发者构建更健壮的Python程序。

1 捕捉一个异常
以使用0作为除数引发ZeroDivisionError异常为例,
print(1/0)

为了确保程序在发生此类异常时不会中断执行,我们需要对异常进行捕获处理,并在捕获时输出具体的异常信息:
try:
print(1/0)
except ZeroDivisionError as e:
print(e)

2 捕捉多个异常
当需要同时处理多种特定异常时,例如ZeroDivisionError和TypeError,可以采用以下应用场景:
① 用于捕获对程序逻辑有特定意义的几种异常,并在触发时执行相应的处理操作。
② 指定一些不影响程序最终目标且可以忽略的异常。当这些异常发生时直接忽略,若出现其他未指定的异常,则需进一步调试处理。
for i in range(2):
print(i)
try:
if i == 0:
print(1/0)
else:
print(1 + 'str')
except (ZeroDivisionError, TypeError) as e:
print(e)

3 Exception捕捉所有异常
当无法确定具体异常类型时,可以使用Exception关键字来捕获所有类型的异常。
例如尝试将一个数值与字符串相加:
try:
print(1 + 'strstrstr')
except Exception as e:
print(e)

4 raise主动触发异常
可以使用raise关键字主动抛出异常,并在括号内添加对该异常的详细说明。执行效果如图所示:
raise ZeroDivisionError("这是一个非常非常非常、很大很大很大的异常。。。")

raise也可用于创建自定义异常类,以定义新的异常类型。当程序满足特定条件(如if True)时,抛出已定义的异常:
例如定义一个名为DangerousError的异常类:
class DangerousError(Exception):
def __init__(self, msg):
self.msg = msg
def __str__(self):
return self.msg
if True:
raise DangerousError("异常警告!异常警告!异常警告!异常警告!异常警告!\n异常警告!异常警告!异常警告!异常警告!异常警告!")
else:
raise DangerousError("请把代码拿回重写。")

5 try…except…else…finally 逻辑
- try块后跟随需要尝试执行的代码部分。
- 如果try块中触发的异常名称与except后指定的异常(或Exception)匹配,则执行对应的except代码块;
- except子句可以有多个,且数量无限制,匹配时从第一个开始依次向下尝试;
- 如果触发了异常但该异常未被任何except子句匹配,程序仍会报错退出;
class DangerousError(Exception):
def __init__(self, msg):
self.msg = msg
def __str__(self):
return self.msg
AError = DangerousError("犯了DangerousErrorA错误")
BError = DangerousError("犯了DangerousErrorB错误")
CError = DangerousError("犯了DangerousErrorC错误")
Elist = [AError, BError, CError, TypeError('1233211234567')]
for i in range(4):
print(i)
try:
raise Elist[i]
except DangerousError as e:
print(e)
如图所示,前三个异常被成功处理,而第四个异常未被处理,导致程序报错。

当try块中的代码执行完毕且未检测到任何异常时,将执行else块中的代码。
for i in range(4):
try:
print(i)
except DangerousError:
print("异常产生。")
else:
print("一切正常。")

无论异常处理结果如何,finally块中的代码一定会被执行。即使
for i in range(4):
try:
if i < 3:
print(i)
else:
print(i)
raise AError
except DangerousError:
print("异常产生。")
else:
print("一切正常。")
finally:
print("异常处理完成。")

当try…except部分检测到未匹配的异常时,程序在运行finally块后结束执行,并抛出异常:
以该例为例,第二个异常TypeError('1233211234567')与DangerousError不匹配。因此循环仅执行了两次,并在输出两次"处理完成。"后程序结束。最外层的print("hello world!")始终未被执行。
Elist = [AError, TypeError('1233211234567'), BError, CError]
for i in range(4):
print(i)
try:
raise Elist[i]
except DangerousError as e:
print(e)
finally:
print("处理完成。")
print("hello world!")

到此这篇关于python 异常捕获详解流程的文章就介绍到这了,更多相关python 异常捕获内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









