在Python编程中,异常处理是保证程序健壮性的重要机制。异常(Exception)是程序运行时发生的错误事件,会中断正常的程序流程。良好的异常处理能够:
Python使用try-except
语句结构来处理异常,其基本语法如下:
try:
# 可能引发异常的代码
except ExceptionType:
# 异常处理代码
最基本的异常捕获形式是指定具体的异常类型:
try:
result = 10 / 0
except ZeroDivisionError:
print("不能除以零!")
可以使用多个except
子句捕获不同类型的异常:
try:
num = int(input("请输入数字: "))
result = 10 / num
except ValueError:
print("输入的不是有效数字!")
except ZeroDivisionError:
print("不能除以零!")
使用Exception
基类可以捕获几乎所有异常(不包含系统退出等特殊异常):
try:
# 可能出错的代码
except Exception as e:
print(f"发生错误: {e}")
注意:过度使用捕获所有异常会掩盖潜在问题,建议尽量捕获具体异常类型。
Python允许在一个except
子句中捕获多种异常:
try:
file = open("data.txt")
data = file.read()
num = int(data)
except (FileNotFoundError, ValueError) as e:
print(f"文件不存在或内容无效: {e}")
可以在一个try-except
块中嵌套另一个:
try:
try:
num = int(input("请输入数字: "))
except ValueError:
print("输入的不是有效数字!")
num = 0
result = 10 / num
except ZeroDivisionError:
print("不能除以零!")
else
子句在try
块没有引发异常时执行:
try:
result = 10 / 2
except ZeroDivisionError:
print("除零错误")
else:
print(f"计算结果: {result}") # 仅当没有异常时执行
finally
子句无论是否发生异常都会执行,常用于资源清理:
file = None
try:
file = open("data.txt", "r")
content = file.read()
except IOError:
print("文件操作失败")
finally:
if file:
file.close() # 确保文件总是被关闭
Python推荐使用with
语句自动管理资源:
try:
with open("data.txt", "r") as file:
content = file.read()
except IOError:
print("文件操作失败")
with
语句会自动调用文件的__enter__()
和__exit__()
方法,确保资源正确释放。
通过继承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}"
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之间
可以构建复杂的异常继承体系:
class DatabaseError(Exception):
"""数据库基类异常"""
class ConnectionError(DatabaseError):
"""连接错误"""
class QueryError(DatabaseError):
"""查询错误"""
使用raise
关键字手动引发异常:
def login(username, password):
if not username or not password:
raise ValueError("用户名和密码不能为空")
# 登录逻辑...
可以在except
块中重新引发当前异常:
try:
# 可能出错的代码
except SomeError:
print("发生错误,记录日志...")
raise # 重新引发异常
使用raise from
创建异常链,保留原始异常信息:
try:
# 可能出错的代码
except SomeError as e:
raise CustomError("自定义错误信息") from e
Python异常处理机制提供了强大的错误处理能力:
try-except
结构可以捕获和处理异常finally
确保资源正确释放raise
允许手动触发异常掌握这些技术后,可以编写出更加健壮、可维护的Python代码,有效处理各种运行时错误情况。