写代码时,最怕遇到程序突然报错崩溃。这时候,异常处理就像给代码配备了一个 “错误急救箱”,能帮我们优雅地处理各种意外情况。无论是文件读取失败,还是用户输入错误,异常处理都能让程序继续运行。今天,咱们就来聊聊这个超实用的技能!
在 Python 里, 异常就是程序运行时遇到的错误。比如,你想让程序用一个数除以 0,或者读取一个不存在的文件,Python 就会 “喊救命”,抛出异常。看个例子:
num = 10 / 0 # 尝试除以0print(num)
运行这段代码,会看到这样的报错:
ZeroDivisionError: division by zero
ZeroDivisionError 就是一种异常类型,告诉我们 “不能除以 0”。如果不处理这些异常,程序就会中断,后面的代码都没法执行了。 二、try-except:捕捉异常的 “黄金搭档” try-except 是 Python 处理异常的核心语法,就像给代码包上一层 “防护罩”。try 块里放可能出错的代码,except 块负责 “接住” 异常并处理。
try: num = 10 / 0 # 可能抛出异常的代码 print(num)except ZeroDivisionError: print("不能除以0哦!")
运行结果:
不能除以0哦!
代码解释: try 块里的 10 / 0 尝试执行除法运算,如果出错就会跳到 except 块。 except ZeroDivisionError 表示专门捕捉 ZeroDivisionError 类型的异常,执行对应的处理代码。 小贴士:如果不确定会遇到哪种异常,可以用 except 捕获所有异常,但这样可能隐藏真正的错误原因,建议优先指定具体的异常类型。 三、多个 except 块:精准处理不同异常 一个程序可能遇到多种异常,这时可以用多个 except 块分别处理。比如,读取文件时可能遇到文件不存在的情况,也可能遇到权限不足的问题:
try: with open('nonexistent_file.txt', 'r') as file: # 尝试打开不存在的文件 content = file.read()except FileNotFoundError: print("文件找不到!")except PermissionError: print("没有读取权限!")
代码解释: 1.如果文件不存在,触发 FileNotFoundError,执行第一个 except 块。 2.如果权限不足,触发 PermissionError,执行第二个 except 块。 四、finally:无论如何都要执行的代码 finally 语句块很特别,不管 try 块里的代码有没有出错,它都会执行。就像游戏结束后,不管输赢都要结算奖励。
try: num = 10 / 2 print(num)except ZeroDivisionError: print("不能除以0!")finally: print("程序执行完毕!")
运行结果:
5程序执行完毕!
finally 常用于释放资源,比如关闭文件、断开数据库连接,确保资源不会因为异常而泄漏。 五、抛出异常:主动 “喊救命” 除了被动处理异常,我们还能主动抛出异常。比如,写一个函数检查用户输入的年龄,如果年龄是负数,就抛出异常:
def check_age(age): if age < 0: raise ValueError("年龄不能是负数!") # 主动抛出异常 return f"你的年龄是 {age} 岁"try: result = check_age(-5) print(result)except ValueError as e: print(e)
运行结果:
年龄不能是负数!
raise 关键字用于抛出异常,这样可以让程序在不满足条件时,及时 “喊救命”,提醒调用者处理问题。 六、自定义异常:打造专属 “警报器” Python 允许我们定义自己的异常类型,就像给程序定制一个专属的 “警报器”。比如,我们想处理游戏中的 “金币不足” 异常:
class InsufficientCoinsError(Exception): passdef buy_item(coins, item_cost): if coins < item_cost: raise InsufficientCoinsError("金币不够,买不了!") return "购买成功!"try: result = buy_item(10, 20) print(result)except InsufficientCoinsError as e: print(e)
这里定义了 InsufficientCoinsError 类,继承自 Exception,然后在函数里按需抛出,让代码的错误处理更贴合业务逻辑。
七、常见错误提醒
1.捕获所有异常的风险:直接用 except 不指定类型,可能隐藏严重错误,比如语法错误也会被当成普通异常 “吃掉”。
2.异常嵌套:多层 try-except 容易让代码变复杂,尽量精简逻辑,避免过度使用。
3.异常信息丢失:自定义异常时,记得传递有用的错误信息,方便调试。
八、练习题
1.写一个函数,接收用户输入的两个数并相除,用异常处理捕获 ZeroDivisionError 和 ValueError(输入非数字的情况)。
2.自定义一个 OutOfStockError 异常,模拟商品库存不足时抛出异常并处理。
更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。
想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!