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}")
# 请完善这个函数!
总结
关键要点:
- else:只在没有异常时执行,适合放成功后的逻辑
- finally:无论是否异常都执行,适合放清理代码
- 使用完整的 try-except-else-finally 结构让代码更健壮
- finally 确保资源不会被泄露
记住: 好的程序员不仅处理错误,还要确保资源被正确释放!
接下来我们将学习常见的异常类型,让你能更精准地捕获和处理错误!
© 版权声明
文章版权归作者所有,未经允许请勿转载。
收藏了,感谢分享