在Python编程中,异常处理是代码健壮性的关键保障。无论是新手还是老手,都难免会遇到程序“崩溃”的情况。本文解析常见异常类型与处理技巧,每个知识点均附代码示例,助你从“报错恐惧”进阶为“异常处理大师”!
一、常见异常类型:你遇到过哪些报错?
1. TypeError
:类型不匹配
触发场景:操作或函数应用于不兼容类型的对象
# 字符串与整数相加会引发TypeError
result = "10" + 5 # 报错:TypeError: can only concatenate str to str
2. ValueError
:无效值
触发场景:函数接收的参数类型正确,但值不合法。
# 将非数字字符串转换为整数
num = int("abc") # 报错:ValueError: invalid literal for int() with base 10: 'abc'
3. IndexError
:索引越界
触发场景:访问序列(列表、元组、字符串)的无效索引位置。
lst = [1, 2, 3]
print(lst[3]) # 报错:IndexError: list index out of range
4. KeyError
:字典键不存在
触发场景:访问字典中不存在的键。
d = {"name": "Alice"}
print(d["age"]) # 报错:KeyError: 'age'
5. AttributeError
:对象属性不存在
触发场景:当试图访问或操作对象未定义的属性或方法时触发
class User:
def __init__(self, name):
self.name = name
user = User("Alice")
print(user.age) # 报错:AttributeError: 'User' object has no attribute 'age'
6. ImportError
:导入模块失败
触发场景:当导入的模块不存在,或模块中不存在指定内容时触发。
# 模块不存在
import non_existent_module # 报错:ImportError: No module named 'non_existent_module'
# 模块存在,但内容不存在
from math import non_existent_function # 报错:ImportError: cannot import name 'non_existent_function'
二、异常处理机制:如何优雅捕获异常?
1. 基础结构:try/except
try:
num = int(input("请输入数字:"))#放可能会发生异常的代码
except ValueError: #捕获单个异常
print("输入的不是有效数字!") #发生异常时执行的代码
2. 捕获多个异常
try:
print(10 / 0) # 可能引发ZeroDivisionError
lst = [1, 2]; print(lst[2]) # 可能引发IndexError
except (ZeroDivisionError, IndexError) as e:
print(f"捕获到异常:{e}")
3. try-except-else
:无异常时执行else代码
try:
num = int("42") #放可能会发生异常的代码
except ValueError:
print("转换失败") #发生异常时执行的代码
else:
print(f"转换成功,结果为:{num}") #没有异常时执行的代码
4. try-finally
:必须执行的清理代码
file = None
try:
file = open("data.txt", "r")#放可能会发生异常的代码
except FileNotFoundError:
print("文件不存在")#发生异常时执行的代码
else:
content = file.read()#没有异常时执行的代码
finally:
if file:
file.close() #不管有没有异常都会执行的代码
三、高级技巧:主动控制异常流
1. 手动抛出异常:raise
def validate_age(age):
if age < 0:
raise ValueError("年龄不能为负数")
return age
try:
validate_age(-5)
except ValueError as e:
print(e) # 输出:年龄不能为负数
2. 忽略异常(慎用!)
try:
print(10 / 0)
except ZeroDivisionError:
pass # 静默处理,不推荐!
3. Assert断言:
用于调试和自检的机制,核心作用是验证代码逻辑中的假设条件是否成立
def calculate_area(width, height):
assert width > 0 and height > 0, "宽度和高度必须大于0"
return width * height
print(calculate_area(3, 5)) # 正常输出15
print(calculate_area(-2, 5)) # 报错:AssertionError: 宽度和高度必须大于0
四、总结:异常处理的核心原则
-
精准捕获:优先指定具体异常类型(如
except ValueError
),避免笼统的except Exception
。 -
资源释放:使用
finally
确保文件、网络连接等资源被正确关闭。 -
主动防御:通过
raise
和assert
提前暴露问题,而非等待程序崩溃。
实战小贴士:
-
遇到报错时,先阅读错误类型(如
TypeError
)和提示信息,定位问题根源。 -
使用
try-except
时,尽量缩小代码块范围,避免隐藏潜在问题。
思维导图总结
将以上内容总结为思维导图,图片可放大,如果确实需要高清PDF版,公众号“零基础AI学习笔记”回复“888”,内容会持续更新。