异常处理
良好的异常处理让程序健壮,而非裸奔。
try/except 核心用法
# 基本结构
try:
risky_operation()
except SomeError:
handle_error()
# 捕获具体异常
try:
x = int(user_input)
except ValueError:
print("输入无效")
# 捕获多个异常
try:
data = json.loads(raw)
except (ValueError, KeyError) as e:
print(f"解析失败: {e}")
# 捕获所有异常(慎用)
try:
do_something()
except Exception as e:
print(f"未知错误: {e}")
else 和 finally
# else: 仅在无异常时执行
try:
result = divide(a, b)
except ZeroDivisionError:
print("除零错误")
else:
print(f"结果: {result}") # 仅无异常时执行
# finally: 无论怎样都执行(资源清理)
try:
f = open("file.txt")
data = f.read()
finally:
f.close() # 总是执行
raise 抛出异常
# 主动抛出异常
def validate_age(age):
if age < 0:
raise ValueError("年龄不能为负")
if age > 150:
raise ValueError("年龄超出合理范围")
return age
# 重新抛出异常
try:
validate_age(200)
except ValueError:
log_error()
raise # 重新抛出
自定义异常
# 定义业务异常
class APIError(Exception):
def __init__(self, code, message):
self.code = code
super().__init__(message)
# 使用
raise APIError(404, "资源不存在")
上下文管理器 (推荐)
# 自动资源管理,finally 都不需要写
with open("file.txt") as f:
data = f.read()
# 文件自动关闭
# 多个资源
with open("a.txt") as f1, open("b.txt") as f2:
pass
⚠️ 最佳实践:不要用 except Exception 捕获所有异常,让具体异常传播;只在能正确处理时才捕获。