26 错误和异常处理之捕获异常

在上一篇中,我们介绍了异常的概念,包括什么是异常、异常的分类,以及为什么异常处理在程序中是如此重要。在本篇中,我们将重点探讨如何捕获异常,使程序在发生错误时能优雅地处理这些错误,而不是异常终止。

捕获异常的基本语法

在 Python 中,可以使用 try...except 语句来捕获异常。其基本结构如下:

1
2
3
4
5
6
try:
# 可能会发生异常的代码块
...
except ExceptionType:
# 异常发生后的处理代码
...

其中,ExceptionType 是你期待捕获的异常类型。如果在 try 块中的代码抛出了指定类型的异常,则 except 块中的代码将被执行。

示例:捕获特定异常

以下是一个简单的示例,用于捕获除零异常:

1
2
3
4
5
6
7
8
9
def divide(a, b):
try:
result = a / b
print(f"结果是: {result}")
except ZeroDivisionError:
print("错误:不能除以零!")

divide(10, 2) # 输出: 结果是: 5.0
divide(10, 0) # 输出: 错误:不能除以零!

在这个示例中,divide 函数尝试进行除法运算。如果除数 b 为零,则抛出 ZeroDivisionError 异常,进入 except 块进行处理。

捕获多个异常

你可以使用多个 except 语句来处理不同类型的异常,或使用元组来同时捕获多个异常。例如:

1
2
3
4
5
6
7
8
9
10
def divide(a, b):
try:
result = a / b
print(f"结果是: {result}")
except (ZeroDivisionError, TypeError) as e:
print(f"发生错误: {e}")

divide(10, 2) # 输出: 结果是: 5.0
divide(10, 0) # 输出: 发生错误: division by zero
divide(10, 'a') # 输出: 发生错误: unsupported operand type(s) for /: 'int' and 'str'

在这个示例中,函数 divide 不仅处理了 ZeroDivisionError,还处理了 TypeError,并给出相应的反馈。

捕获所有异常

有时可能希望捕获所有类型的异常,可以使用不指定异常类型的 except 块:

1
2
3
4
5
6
7
8
9
10
def divide(a, b):
try:
result = a / b
print(f"结果是: {result}")
except Exception as e: # 捕获所有异常
print(f"发生错误: {e}")

divide(10, 2) # 输出: 结果是: 5.0
divide(10, 0) # 输出: 发生错误: division by zero
divide(10, 'a') # 输出: 发生错误: unsupported operand type(s) for /: 'int' and 'str'

需要注意的是,虽然捕获所有异常可以使程序更加健壮,但这也可能掩盖了其他潜在的问题,因此在实际项目中,应当谨慎使用。

finally 块

try 语句块可以包括一个 finally 块,它在 tryexcept 完成后执行,无论是否发生异常。这在需要进行清理操作时非常有用:

1
2
3
4
5
6
7
8
9
10
11
12
13
def divide(a, b):
try:
result = a / b
print(f"结果是: {result}")
except ZeroDivisionError:
print("错误:不能除以零!")
finally:
print("清理工作完成。")

divide(10, 2) # 输出: 结果是: 5.0
# 清理工作完成。
divide(10, 0) # 输出: 错误:不能除以零!
# 清理工作完成。

在这个示例中,finally 块确保在每次调用之后都会打印“清理工作完成”。

总结

在本篇教程中,我们学习了如何通过 try...except 结构捕获异常,处理程序中的错误,以及使用 finally 块进行清理工作。在下一篇中,我们将继续深入探讨如何自定义异常,以便在面临特定的错误情况下提供更自定义的错误处理。

在实际开发中,异常处理是构建健壮程序的重要一环,希望大家能在日常编码中灵活运用!

26 错误和异常处理之捕获异常

https://zglg.work/python-zero/26/

作者

IT教程网(郭震)

发布于

2024-08-10

更新于

2024-08-10

许可协议

分享转发

复习上节

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论