python让程序更健壮 – 异常处理:else和finally子句

学会了基本的 try-except,目前我们来学习两个强劲的小伙伴:else 和 finally。它们能让我们的异常处理更加完善和优雅!

完整的异常处理结构 ️

try:
    # 尝试执行的代码(可能出错)
except:
    # 出错时执行的代码
else:
    # 没有出错时执行的代码
finally:
    # 无论是否出错都会执行的代码

1. else子句:当一切顺利时

什么是else子句?

  • 只有当 try 块中的代码没有发生任何异常时才会执行
  • 如果发生了异常,else 块会被跳过

示例1:文件读取的完美场景

print("=== 文件读取器 ===")

try:
    filename = input("请输入文件名: ")
    file = open(filename, 'r')
    
except FileNotFoundError:
    print("❌ 错误:文件不存在!")
    
else:
    # 只有在文件成功打开时才执行
    content = file.read()
    print("✅ 文件内容读取成功!")
    print(f"内容:{content}")
    file.close()

print("程序继续运行...")

运行结果(文件存在时):

=== 文件读取器 ===
请输入文件名: example.txt
✅ 文件内容读取成功!
内容:Hello World!
程序继续运行...

运行结果(文件不存在时):

=== 文件读取器 ===
请输入文件名: not_exist.txt
❌ 错误:文件不存在!
程序继续运行...

示例2:用户登录系统

def login_system():
    print("=== 用户登录 ===")
    
    try:
        username = input("请输入用户名: ")
        password = input("请输入密码: ")
        
        # 模拟验证过程(这里简化了)
        if not username or not password:
            raise ValueError("用户名和密码不能为空")
            
    except ValueError as e:
        print(f"❌ 登录失败: {e}")
        
    else:
        # 只有登录成功时才执行
        print(f"✅ 欢迎回来,{username}!")
        print(" 加载您的邮件...")
        print(" 加载您的好友列表...")
        # 这里可以添加更多登录成功后的操作

# 测试
login_system()

2. finally子句:无论如何都要执行 ️

什么是finally子句?

  • 无论是否发生异常都会执行
  • 常用于清理资源(关闭文件、断开连接等)

示例3:文件操作的安全方式

print("=== 安全文件操作 ===")

file = None  # 初始化变量

try:
    filename = input("请输入要读取的文件名: ")
    file = open(filename, 'r')
    content = file.read()
    print("文件内容:", content)
    
except FileNotFoundError:
    print("❌ 错误:文件不存在!")
    
except Exception as e:
    print(f"❌ 发生未知错误: {e}")
    
finally:
    # 无论成功还是失败,都要确保文件被关闭
    if file:
        file.close()
        print(" 文件已安全关闭")
    print(" 清理操作完成")

print("程序结束")

示例4:数据库连接示例

def database_operation():
    print("=== 数据库操作 ===")
    connection = None
    
    try:
        # 模拟连接数据库
        print(" 连接数据库中...")
        connection = "数据库连接对象"  # 模拟连接
        print("✅ 数据库连接成功!")
        
        # 模拟一些数据库操作(可能出错)
        result = 10 / 0  # 这会引发异常
        
    except ZeroDivisionError:
        print("❌ 数据库操作失败!")
        
    finally:
        # 无论操作是否成功,都要关闭连接
        if connection:
            print(" 关闭数据库连接...")
            # connection.close()  # 实际中会调用关闭方法
        print(" 资源清理完成")

# 测试
database_operation()

3. 完整示例:综合使用所有部分

示例5:完整的计算器程序

def smart_calculator():
    print(" 智能计算器")
    print("-" * 20)
    
    try:
        num1 = float(input("请输入第一个数字: "))
        num2 = float(input("请输入第二个数字: "))
        operator = input("请输入运算符 (+, -, *, /): ")
        
        if operator == '+':
            result = num1 + num2
        elif operator == '-':
            result = num1 - num2
        elif operator == '*':
            result = num1 * num2
        elif operator == '/':
            if num2 == 0:
                raise ZeroDivisionError("除数不能为零")
            result = num1 / num2
        else:
            raise ValueError("不支持的操作符")
            
    except ValueError as e:
        print(f"❌ 输入错误: {e}")
        
    except ZeroDivisionError as e:
        print(f"❌ 计算错误: {e}")
        
    else:
        # 只有计算成功时才显示结果
        print(f"✅ 计算结果: {num1} {operator} {num2} = {result}")
        
    finally:
        # 无论成功失败都执行
        print(" 本次计算会话结束")
        print("=" * 30)

# 测试计算器
smart_calculator()

示例6:网络请求模拟

import time

def download_file(filename):
    print(f" 开始下载: {filename}")
    start_time = time.time()
    
    try:
        # 模拟下载过程(可能失败)
        if "error" in filename.lower():
            raise ConnectionError("网络连接失败")
            
        # 模拟下载时间
        time.sleep(1)
        file_size = 1024  # 模拟文件大小
        
    except ConnectionError as e:
        print(f"❌ 下载失败: {e}")
        return False
        
    else:
        # 只有下载成功时才执行
        end_time = time.time()
        download_time = end_time - start_time
        print(f"✅ 下载成功!")
        print(f" 文件大小: {file_size} KB")
        print(f"⏱️ 下载时间: {download_time:.2f} 秒")
        return True
        
    finally:
        # 无论成功失败都执行
        print(" 清理临时文件...")
        print(" 重置下载状态...")

# 测试下载
print("测试1:正常下载")
download_file("document.pdf")

print("
测试2:失败下载")
download_file("error_file.txt")

记忆技巧

子句

执行时机

常用场景

try

尝试执行

可能出错的代码

except

出错时

错误处理和用户提示

else

成功时

成功后的后续操作

finally

总是执行

资源清理、收尾工作

练习时间!

练习1:改善用户注册系统

def user_registration():
    print("=== 用户注册系统 ===")
    
    # 你的任务:添加 else 和 finally 子句
    try:
        username = input("设置用户名: ")
        if len(username) < 3:
            raise ValueError("用户名至少3个字符")
            
        password = input("设置密码: ")
        if len(password) < 6:
            raise ValueError("密码至少6个字符")
            
        # 这里应该添加 else 和 finally
        # else: 显示注册成功信息
        # finally: 显示系统提示信息
        
    except ValueError as e:
        print(f"注册失败: {e}")

# 请完善这个函数!

总结

关键要点:

  1. else:只在没有异常时执行,适合放成功后的逻辑
  2. finally:无论是否异常都执行,适合放清理代码
  3. 使用完整的 try-except-else-finally 结构让代码更健壮
  4. finally 确保资源不会被泄露

记住: 好的程序员不仅处理错误,还要确保资源被正确释放!

接下来我们将学习常见的异常类型,让你能更精准地捕获和处理错误!

© 版权声明

相关文章

1 条评论

  • 好香饱饱o
    好香饱饱o 投稿者

    收藏了,感谢分享

    回复