挑战14天学会Python,第13天学习笔记!加油!
1. 异常处理概述
在Python编程中,异常处理是保证程序健壮性的重要机制。异常(Exception)是程序运行时发生的错误事件,会中断正常的程序流程。良好的异常处理能够:
- 防止程序意外崩溃
- 提供友好的错误提示
- 实现错误恢复逻辑
- 保证资源正确释放
Python使用try-except
语句结构来处理异常,其基本语法如下:
try:
# 可能引发异常的代码
except ExceptionType:
# 异常处理代码
2. 基础异常捕获
2.1 捕获单个异常
最基本的异常捕获形式是指定具体的异常类型:
try:
result = 10 / 0
except ZeroDivisionError:
print("不能除以零!")
2.2 捕获多个异常
可以使用多个except
子句捕获不同类型的异常:
try:
num = int(input("请输入数字: "))
result = 10 / num
except ValueError:
print("输入的不是有效数字!")
except ZeroDivisionError:
print("不能除以零!")
2.3 捕获所有异常
使用Exception
基类可以捕获几乎所有异常(不包含系统退出等特殊异常):
try:
# 可能出错的代码
except Exception as e:
print(f"发生错误: {e}")
注意:过度使用捕获所有异常会掩盖潜在问题,建议尽量捕获具体异常类型。
3. 高级异常处理技术
3.1 多重异常捕获
Python允许在一个except
子句中捕获多种异常:
try:
file = open("data.txt")
data = file.read()
num = int(data)
except (FileNotFoundError, ValueError) as e:
print(f"文件不存在或内容无效: {e}")
3.2 try-except语句嵌套
可以在一个try-except
块中嵌套另一个:
try:
try:
num = int(input("请输入数字: "))
except ValueError:
print("输入的不是有效数字!")
num = 0
result = 10 / num
except ZeroDivisionError:
print("不能除以零!")
3.3 else子句的使用
else
子句在try
块没有引发异常时执行:
try:
result = 10 / 2
except ZeroDivisionError:
print("除零错误")
else:
print(f"计算结果: {result}") # 仅当没有异常时执行
4. 资源管理与finally代码块
4.1 finally的基本用法
finally
子句无论是否发生异常都会执行,常用于资源清理:
file = None
try:
file = open("data.txt", "r")
content = file.read()
except IOError:
print("文件操作失败")
finally:
if file:
file.close() # 确保文件总是被关闭
4.2 with语句与上下文管理器
Python推荐使用with
语句自动管理资源:
try:
with open("data.txt", "r") as file:
content = file.read()
except IOError:
print("文件操作失败")
with
语句会自动调用文件的__enter__()
和__exit__()
方法,确保资源正确释放。
5. 自定义异常类
5.1 创建自定义异常
通过继承Exception
类可以创建自定义异常:
class InvalidAgeError(Exception):
"""年龄无效异常"""
def __init__(self, age, message="年龄必须在0-120之间"):
self.age = age
self.message = message
super().__init__(self.message)
def __str__(self):
return f"{self.age} -> {self.message}"
5.2 使用自定义异常
def set_age(age):
if not 0 <= age <= 120:
raise InvalidAgeError(age)
print(f"年龄设置为: {age}")
try:
set_age(150)
except InvalidAgeError as e:
print(e) # 输出: 150 -> 年龄必须在0-120之间
5.3 异常继承体系
可以构建复杂的异常继承体系:
class DatabaseError(Exception):
"""数据库基类异常"""
class ConnectionError(DatabaseError):
"""连接错误"""
class QueryError(DatabaseError):
"""查询错误"""
6. 手动引发异常
6.1 raise语句
使用raise
关键字手动引发异常:
def login(username, password):
if not username or not password:
raise ValueError("用户名和密码不能为空")
# 登录逻辑...
6.2 重新引发异常
可以在except
块中重新引发当前异常:
try:
# 可能出错的代码
except SomeError:
print("发生错误,记录日志...")
raise # 重新引发异常
6.3 异常链
使用raise from
创建异常链,保留原始异常信息:
try:
# 可能出错的代码
except SomeError as e:
raise CustomError("自定义错误信息") from e
7. 总结
Python异常处理机制提供了强大的错误处理能力:
- 基础
try-except
结构可以捕获和处理异常 - 多重异常捕获和嵌套使代码更简洁
finally
确保资源正确释放- 自定义异常提高代码可读性和维护性
raise
允许手动触发异常- 合理的异常处理是编写健壮程序的关键
掌握这些技术后,可以编写出更加健壮、可维护的Python代码,有效处理各种运行时错误情况。