异常捕获:try-except
在 Python 编程中,异常捕获是一种用于处理程序运行时错误的机制。它通过 try-except
语句捕获异常,防止程序因错误中断,让程序能够继续执行或提供友好的错误提示。
1. 为什么需要异常捕获?
没有异常捕获时,程序遇到错误会直接崩溃。例如:
num = int(input("请输入一个数字:"))
print(10 / num) # 如果输入 0,会抛出 ZeroDivisionError
如果用户输入了 0
,程序会直接报错并退出:
ZeroDivisionError: division by zero
通过异常捕获,程序可以优雅地处理这个问题:
try:
num = int(input("请输入一个数字:"))
print(10 / num)
except ZeroDivisionError:
print("错误:不能除以零!")
2. try-except
的基本结构
语法
try:
# 可能会引发异常的代码
except 异常类型:
# 异常发生时的处理代码
示例
try:
result = 10 / 0
except ZeroDivisionError:
print("错误:不能除以零!")
# 输出:
# 错误:不能除以零!
3. 捕获多个异常
当可能发生多种不同的异常时,可以为每种异常指定不同的处理逻辑。
语法
try:
# 可能会引发多种异常的代码
except 异常类型1:
# 处理异常类型1的代码
except 异常类型2:
# 处理异常类型2的代码
示例
try:
num = int(input("请输入一个数字:"))
result = 10 / num
except ValueError:
print("错误:输入的不是数字!")
except ZeroDivisionError:
print("错误:不能除以零!")
# 测试输入:
# 输入 "abc" 输出:错误:输入的不是数字!
# 输入 0 输出:错误:不能除以零!
4. 捕获所有异常
如果不确定可能会引发的异常类型,可以使用 Exception
捕获所有异常:
语法
try:
# 可能会引发异常的代码
except Exception as e:
# 处理所有异常
print(f"发生错误:{e}")
示例
try:
result = 10 / "a"
except Exception as e:
print(f"发生错误:{e}")
# 输出:
# 发生错误:unsupported operand type(s) for /: 'int' and 'str'
⚠️ 注意:捕获所有异常可能掩盖问题,通常建议明确指定要捕获的异常类型。
5. else
和 finally
块
else
块
- 当
try
块没有发生异常时执行。 - 适合放置正常执行的代码。
finally
块
- 无论是否发生异常,都会执行。
- 通常用于清理资源(如关闭文件或释放锁)。
语法
try:
# 可能会引发异常的代码
except 异常类型:
# 异常处理代码
else:
# 没有发生异常时的代码
finally:
# 始终会执行的代码
示例
try:
num = int(input("请输入一个数字:"))
result = 10 / num
except ZeroDivisionError:
print("错误:不能除以零!")
except ValueError:
print("错误:输入无效!")
else:
print(f"计算结果是:{result}")
finally:
print("程序执行结束。")
# 测试输入:
# 输入 2 输出:
# 计算结果是:5.0
# 程序执行结束。
# 输入 0 输出:
# 错误:不能除以零!
# 程序执行结束。
6. 嵌套异常捕获
try-except
块可以嵌套使用,用于更复杂的错误处理逻辑。
示例
try:
num = int(input("请输入一个数字:"))
try:
result = 10 / num
except ZeroDivisionError:
print("错误:不能除以零!")
else:
print(f"计算结果是:{result}")
except ValueError:
print("错误:输入的不是数字!")
7. 捕获异常的常见错误
过度捕获异常 捕获所有异常可能掩盖潜在问题,应该尽量捕获特定的异常类型。
try: risky_operation() except Exception: print("发生错误")
改进:明确指定异常类型。
忽略异常处理 捕获异常后没有处理逻辑,可能让程序更难调试。
try: risky_operation() except ValueError: pass # 什么也不做
改进:记录日志或提供有意义的提示。
8. 小结
try-except
是处理异常的核心工具。- 使用
else
块处理没有异常时的正常逻辑。 - 使用
finally
块清理资源或完成善后工作。 - 捕获异常时,尽量明确指定异常类型,避免过度捕获。
通过灵活使用异常捕获机制,可以提高程序的健壮性,让用户体验更加友好,同时方便开发者调试和维护代码。