在Python中,try
语句用于处理程序运行时的异常(错误),确保代码的健壮性。其基本结构包括try
、except
、else
和finally
块,各部分的用法如下:
1. 基本语法
try:# 可能引发异常的代码
except [异常类型]:# 异常处理代码
else:# 无异常时执行的代码
finally:# 无论是否有异常都会执行的代码
2. except
块
-
捕获特定异常:指定具体的异常类型(如
ValueError
、TypeError
)。 -
捕获多个异常:用元组列出多个异常类型。
-
捕获所有异常:省略异常类型(不推荐,可能掩盖错误)。
示例:
try:result = 10 / 0
except ZeroDivisionError:print("除数不能为零!")
except (TypeError, ValueError) as e:print(f"类型或值错误: {e}")
except Exception as e: # 捕获所有非系统退出异常print(f"未知错误: {e}")
3. else
块
-
仅在
try
块中的代码未引发异常时执行。 -
适用于处理正常逻辑,与
try
代码分离,避免意外捕获异常。
示例:
try:data = read_file("data.txt")
except FileNotFoundError:print("文件不存在!")
else:process_data(data) # 无异常时才处理数据
4. finally
块
-
无论是否发生异常,均会执行。
-
通常用于释放资源(如关闭文件、数据库连接)。
示例:
file = None
try:file = open("file.txt", "r")content = file.read()
except IOError as e:print(f"文件操作失败: {e}")
finally:if file: # 确保文件对象存在file.close() # 无论如何都关闭文件
5. 主动抛出异常(raise
)
-
使用
raise
手动触发异常,可自定义错误信息。 -
结合
from
保留原始异常链(Python 3+)。
示例:
def validate_age(age):if age < 0:raise ValueError("年龄不能为负数!")try:validate_age(-5)
except ValueError as e:print(e)# 重新抛出异常并保留原始上下文raise RuntimeError("验证失败") from e
6. 最佳实践
-
避免空
except
块:明确捕获特定异常,防止隐藏错误。 -
优先使用
with
管理资源:如文件操作,替代finally
手动关闭。 -
异常信息记录:使用
as e
获取异常对象,输出详细信息。 -
慎用
Exception
:仅当需要处理所有可能的非系统异常时使用。
示例(推荐写法):
try:with open("data.txt", "r") as f: # 自动管理文件关闭data = f.read()
except FileNotFoundError:print("文件未找到!")
else:print("文件内容:", data)
7. 完整流程示例
def main():try:num = int(input("输入一个整数: "))result = 100 / numexcept ValueError:print("输入的不是整数!")except ZeroDivisionError:print("不能输入0!")else:print("计算结果:", result)finally:print("程序执行完毕。")if __name__ == "__main__":main()
总结
-
try
/except
:处理已知异常,增强代码容错性。 -
else
:分离正常逻辑与异常处理。 -
finally
:确保资源释放,避免泄露。 -
raise
:主动抛出异常,支持错误传递与链式追踪。
合理使用try
语句能够使程序更健壮,但需注意避免过度捕获或隐藏关键错误。