飞翔飞翔
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
  • 学习路径
  • 第1章 认识Python

    • Python 历史与特点
    • Python 2 与 Python 3 的核心差异
    • 安装与运行 Python 2.7.18
    • 编码规范 PEP 8
  • 第2章 基础语法

    • 变量与对象
    • 数字类型
    • 字符串 str
    • Unicode 字符串
    • 运算符
    • 空值 None
  • 第3章 流程控制

    • if 条件语句
    • if-else 条件语句
    • if-elif-else 多分支
    • 条件表达式(三元运算符)
    • while 循环
    • for 循环
    • range 与 xrange
    • 循环控制:break、continue、pass
    • 循环 else 子句
  • 第4章 数据结构

    • 列表基础
    • 列表方法
    • 列表推导式
    • 元组
    • 字典基础
    • 字典方法
    • 字典循环技巧
    • 集合
    • 序列解包
    • 序列比较
  • 第5章 函数

    • 定义函数
    • 参数传递机制
    • 默认参数
    • 关键字参数
    • 可变参数
    • Lambda 表达式
    • 文档字符串
    • 函数对象
  • 第6章 模块与包

    • import 导入
    • 模块搜索路径
    • name 与主程序
    • 编译文件 .pyc 与 .pyo
    • 包结构
    • dir() 函数
  • 第7章 文件与IO

    • 打开与关闭文件
    • 文件读写方法
    • with 上下文管理器
    • 格式化输出:% 操作符
    • 格式化输出:str.format()
    • JSON 序列化
  • 第8章 面向对象

    • 类定义与实例化
    • init 构造方法
    • 类变量与实例变量
    • 方法调用与 self
    • 继承基础
    • 多重继承
    • 新式类与旧式类
    • 私有变量与名称改写
    • 属性装饰器 property
    • 类方法与静态方法
    • 魔术方法
    • 空类与数据记录
  • 第9章 异常处理

    • 异常类型
    • try-except
    • try-except-else-finally
    • 抛出异常 raise
    • 自定义异常
    • with 语句与上下文管理器
  • 第10章 迭代器与生成器

    • 迭代器协议
    • 生成器函数
    • 生成器表达式
    • itertools模块
  • 第11章 标准库精要

    • os模块
    • sys模块
    • datetime模块
    • re模块
    • json模块
    • collections模块
    • math与random模块
    • urllib2与网络请求
    • subprocess与命令执行
    • threading与并发
    • unittest与测试
    • 虚拟环境与包管理
  • 第12章 工程实践

    • 调试技巧
    • 性能分析
    • 文档与注释
    • 下一步学习

try-except-else-finally

try-except 可以与 else 和 finally 子句组合,形成完整的异常处理结构。每个子句有明确的语义,组合使用可以写出精确的错误处理逻辑。

完整结构

try:
    # 可能出错的代码
    result = 10 / 2
except ZeroDivisionError:
    # 出错时执行
    print "Division by zero"
else:
    # 没有异常时执行
    print "Result:", result
finally:
    # 无论是否异常都执行
    print "Cleanup"

# 输出:
# Result: 5.0
# Cleanup

else 子句

else 块在 try 块没有抛出异常时执行。它的用途是把"正常逻辑"和"错误处理"分离:

try:
    data = fetch_data()
except NetworkError:
    print "Network failed"
else:
    # 只有 fetch_data() 成功时才执行
    process(data)
    save(data)

如果把 process(data) 放在 try 块中,它抛出的异常会被 except NetworkError 捕获——这可能不是想要的:

try:
    data = fetch_data()
    process(data)       # 如果这里出错,会被 except 捕获
    save(data)
except NetworkError:
    # 可能捕获了 process() 或 save() 的错误,误以为是网络问题
    print "Network failed"

else 让 except 只捕获 fetch_data() 的异常,后续操作有自己的错误处理。

finally 子句

finally 块无论是否发生异常都会执行,常用于资源清理:

f = open("data.txt", "r")
try:
    data = f.read()
    process(data)
except IOError:
    print "Read failed"
finally:
    f.close()           # 无论是否异常,文件都会关闭
    print "File closed"

finally 在以下情况都会执行:

  • try 正常完成
  • try 发生异常并被 except 捕获
  • try 发生异常但未被捕获
  • try 或 except 中有 return、break、continue
def test():
    try:
        return "try"
    finally:
        print "finally"     # 会在 return 之前执行!

print test()
# 输出:
# finally
# try

finally 中的代码甚至在 return 之后执行。如果 finally 中也有 return,它会覆盖 try 中的返回值:

def test():
    try:
        return "try"
    finally:
        return "finally"    # 覆盖 try 的返回值!

print test()    # finally

组合使用

try:
    conn = create_connection()
    data = conn.fetch()
except ConnectionError:
    print "Connection failed"
    return None
else:
    result = process(data)
    return result
finally:
    conn.close()            # 无论成功失败,连接都关闭

与 with 语句的对比

with 语句是 try-finally 的语法糖,用于上下文管理:

# try-finally 写法
f = open("data.txt", "r")
try:
    data = f.read()
finally:
    f.close()

# with 写法(等价但更简洁)
with open("data.txt", "r") as f:
    data = f.read()

对于文件、锁、数据库连接等资源,with 是首选。对于复杂的清理逻辑,try-finally 更灵活。

实际应用

事务处理:

try:
    db.begin()
    update_account(from_acc, -amount)
    update_account(to_acc, amount)
    db.commit()
except TransactionError:
    db.rollback()
    print "Transaction failed"
else:
    print "Transaction completed"
finally:
    db.close()

临时状态恢复:

old_value = config.debug
try:
    config.debug = True
    run_tests()
finally:
    config.debug = old_value      # 无论测试是否通过,恢复配置

执行顺序总结

情况执行顺序
无异常try → else → finally
有异常,被捕获try(到异常点)→ except → finally
有异常,未捕获try(到异常点)→ finally → 异常传播
try 中有 returntry(到 return)→ finally → return
except 中有 returntry → except(到 return)→ finally → return
上一页
try-except
下一页
抛出异常 raise