Python中的异常处理机制
字数 656 2025-11-05 23:47:54
Python中的异常处理机制
描述
异常处理是Python中处理程序运行时错误的重要机制。当程序执行过程中出现错误(如除零、文件不存在、索引越界等),Python会抛出异常。如果不处理这些异常,程序会终止执行。Python提供了try/except/finally/else结构来捕获和处理异常,保证程序的健壮性。
异常处理的基本结构
try:
# 可能抛出异常的代码块
risky_operation()
except ValueError as e:
# 处理特定类型的异常
print(f"值错误: {e}")
except (TypeError, ZeroDivisionError):
# 处理多种类型的异常
print("类型错误或除零错误")
except Exception as e:
# 处理所有其他异常
print(f"其他错误: {e}")
else:
# 没有异常发生时执行
print("操作成功")
finally:
# 无论是否发生异常都会执行
print("清理工作")
详细步骤解析
-
try块 - 监控异常
- try块包含可能抛出异常的代码
- 执行顺序:从上到下执行try块内的语句
- 一旦某条语句抛出异常,后续代码不会执行
-
except块 - 捕获异常
- 可以有多个except块处理不同类型的异常
- 匹配规则:按顺序检查异常类型,执行第一个匹配的except块
- 异常类继承关系:Exception ← ArithmeticError ← ZeroDivisionError
- 可以使用元组同时捕获多种异常
-
else块 - 无异常时执行
- 只有当try块没有抛出异常时执行
- 适合放置那些依赖try块成功执行的代码
- 与在try块末尾写代码的区别:else块中的异常不会被前面的except捕获
-
finally块 - 清理资源
- 无论是否发生异常都会执行
- 常用于释放资源(关闭文件、数据库连接等)
- 即使有return语句,finally块也会执行
异常处理示例
def divide_numbers(a, b):
try:
result = a / b
except ZeroDivisionError:
print("错误:除数不能为零")
return None
except TypeError as e:
print(f"类型错误:{e}")
return None
else:
print(f"计算结果:{result}")
return result
finally:
print("除法运算完成")
# 测试用例
divide_numbers(10, 2) # 正常情况
divide_numbers(10, 0) # 除零错误
divide_numbers(10, "2") # 类型错误
自定义异常
class MyCustomError(Exception):
"""自定义异常类"""
def __init__(self, message, code):
super().__init__(message)
self.code = code
def validate_age(age):
if age < 0:
raise MyCustomError("年龄不能为负数", 1001)
if age > 150:
raise MyCustomError("年龄不合理", 1002)
return True
try:
validate_age(-5)
except MyCustomError as e:
print(f"自定义错误 {e.code}: {e}")
异常处理的最佳实践
-
具体异常优先
# 不推荐 try: # 某些操作 except Exception: pass # 推荐 try: # 某些操作 except FileNotFoundError: # 处理文件不存在 except PermissionError: # 处理权限错误 -
避免空的except块
# 不推荐 - 隐藏错误 try: risky_call() except: pass # 推荐 - 至少记录错误 try: risky_call() except Exception as e: logger.error(f"操作失败: {e}") -
使用异常链
try: 1 / 0 except ZeroDivisionError: raise ValueError("计算错误") from None
异常处理是编写健壮Python程序的关键技能,合理的异常处理可以让程序在遇到错误时优雅地降级或恢复,而不是直接崩溃。