Python的try-except语句是处理运行时异常的核心工具,能够在程序出现错误时避免直接崩溃,让开发者可以自定义异常处理逻辑,提升程序的容错能力。无论是处理用户输入错误、文件读写异常还是网络请求失败,都可以通过这个机制实现优雅的错误处理。

try-except的基本语法结构
try-except的基础结构由try块和except块组成,try块中放置可能出现异常的代码,except块中放置异常发生后的处理逻辑。基本语法如下:
try:
# 可能出现异常的代码
result = 10 / 0
except ZeroDivisionError:
# 捕获到除零错误后的处理逻辑
print("发生除零错误,除数不能为0")
当try块中的代码执行出现异常时,Python会暂停try块的执行,查找匹配的except块,如果找到对应的异常类型,就执行该except块中的代码。
捕获多种类型的异常
实际开发中,一段代码可能会出现多种不同类型的异常,我们可以通过多个except块分别捕获不同的异常,也可以使用一个except块捕获多种异常。
多个except块分别捕获
这种方式可以针对不同的异常类型给出不同的处理方案,逻辑更清晰:
try:
num = int("abc") # 会触发ValueError
result = 10 / num
except ValueError:
print("输入的字符串无法转换为整数")
except ZeroDivisionError:
print("除数不能为0")
单个except块捕获多种异常
如果多种异常的处理逻辑相同,可以把异常类型放到一个元组中,用一个except块捕获:
try:
# 这里可能出现ValueError或者ZeroDivisionError
num = int(input("请输入一个数字:"))
result = 10 / num
except (ValueError, ZeroDivisionError) as e:
# as关键字可以获取异常的具体信息
print(f"发生错误:{e}")
搭配else和finally子句使用
try-except还可以搭配else和finally子句,实现更完整的异常处理逻辑。
else子句
else块中的代码会在try块中的代码没有发生任何异常时执行,适合放置try块正常执行后的后续逻辑:
try:
num = int("123")
result = 10 / num
except (ValueError, ZeroDivisionError) as e:
print(f"发生错误:{e}")
else:
# 没有异常时执行
print(f"计算结果为:{result}")
finally子句
finally块中的代码无论try块是否发生异常,都会被执行,通常用来做资源清理工作,比如关闭文件、释放网络连接等:
file = None
try:
file = open("test.txt", "r")
content = file.read()
print(content)
except FileNotFoundError:
print("文件不存在")
finally:
# 无论是否发生异常,都关闭文件
if file:
file.close()
print("文件已关闭")
捕获所有异常的正确方式
有时候我们需要捕获所有可能的异常,但是不建议直接使用空的except块,因为这样会捕获包括KeyboardInterrupt、SystemExit这样的系统退出异常,导致程序无法正常退出。正确的方式是捕获Exception类,它是大部分常见异常的父类:
try:
# 未知的可能出现异常的逻辑
import non_exist_module
except Exception as e:
print(f"捕获到异常:{e}")
自定义异常类型
除了使用Python内置的异常类型,我们还可以根据业务需求自定义异常,自定义异常需要继承Exception类:
# 自定义异常类
class AgeError(Exception):
def __init__(self, age):
self.age = age
super().__init__(f"年龄{age}不合法,必须在0到150之间")
def check_age(age):
if age < 0 or age > 150:
raise AgeError(age) # 抛出自定义异常
print(f"年龄{age}合法")
try:
check_age(200)
except AgeError as e:
print(e)
实际开发中的使用建议
- 尽量捕获具体的异常类型,不要盲目使用宽泛的异常捕获,避免隐藏真正的问题
- except块中的处理逻辑要简洁,不要把复杂的业务逻辑放到异常处理中
- 不要滥用异常处理,能用条件判断避免的错误就不要依赖异常捕获,比如判断除数是否为0比捕获除零错误更高效
- finally块中不要写可能再次抛出异常的代码,避免异常覆盖的问题
Pythontry-except异常捕获异常处理修改时间:2026-07-02 06:21:33