Python异常处理全攻略

在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

四、总结:异常处理的核心原则

  1. 精准捕获:优先指定具体异常类型(如except ValueError),避免笼统的except Exception

  2. 资源释放:使用finally确保文件、网络连接等资源被正确关闭。

  3. 主动防御:通过raiseassert提前暴露问题,而非等待程序崩溃。


实战小贴士

  • 遇到报错时,先阅读错误类型(如TypeError)和提示信息,定位问题根源。

  • 使用try-except时,尽量缩小代码块范围,避免隐藏潜在问题。

思维导图总结

将以上内容总结为思维导图,图片可放大,如果确实需要高清PDF版,公众号“零基础AI学习笔记”回复“888”,内容会持续更新。

任何疑问、批评、指导,请毫不犹豫地私信作者!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值