【Qwen3-Max】太棒了!欢迎来到 【跟着AI学Python】第12天!🎉今天我们将学习 异常处理(Exception Handling) —— 让你的程序在遇到错误时不崩溃、能恢复、有提示,真正做到“优雅地失败”!
💡 程序出错不可避免,但如何应对错误,是区分新手和专业开发者的关键!
🎯 第12天目标:
✅ 掌握 try...except...else...finally 完整结构✅ 识别并处理常见内置异常类型✅ 学会主动抛出异常(raise)✅ 编写清晰、安全的错误处理逻辑
📘 一、为什么需要异常处理?
想象这些场景:
❌ 不处理异常 → 程序直接崩溃,用户体验极差✅ 正确处理异常 → 提示用户、记录日志、尝试恢复、优雅退出
📘 二、异常处理基本结构:try...except
try: # 可能出错的代码 risky_code()except SomeException: # 处理特定异常 handle_error()
🔹 示例:处理除零错误
def divide(a, b): try: result = a / b return result except ZeroDivisionError: print("❌ 错误:不能除以零!") return Noneprint(divide(10, 2)) # 5.0print(divide(10, 0)) # ❌ 错误:不能除以零!
📘 三、完整结构:try...except...else...finally
| | |
|---|
try | | |
except | | |
else | | |
finally | | 无论是否异常,总是执行 |
🔹 综合示例:文件读取
✅ finally 是释放资源(文件、网络连接、锁)的黄金位置!
📘 四、捕获多种异常
方法1:多个 except
try: value = int(input("请输入一个数字: ")) result = 100 / valueexcept ValueError: print("⚠️ 输入的不是有效数字!")except ZeroDivisionError: print("⚠️ 不能输入零!")
方法2:元组合并
try: # ...except (ValueError, ZeroDivisionError) as e: print(f"⚠️ 发生错误: {e}")
方法3:通用异常(慎用!)
try: # ...except Exception as e: # 捕获所有非系统退出异常 print(f"未知错误: {e}") # ❌ 不要只写 except: (会捕获 KeyboardInterrupt 等!)
⚠️ 最佳实践:
📘 五、常见内置异常类型
| | |
|---|
ValueError | | int("abc") |
TypeError | | "hello" + 5 |
IndexError | | [1,2][5] |
KeyError | | {"a":1}["b"] |
FileNotFoundError | | open("missing.txt") |
ZeroDivisionError | | 10 / 0 |
AttributeError | | "str".append() |
ImportError | | import non_existent_module |
💡 使用 dir(__builtins__) 查看所有内置异常。
📘 六、主动抛出异常:raise
当你检测到业务逻辑错误时,可主动抛出异常。
🔹 示例:验证年龄
✅ 自定义错误信息,让调试更轻松!
📘 七、自定义异常(进阶)
通过继承 Exception 创建专属异常:
class InvalidEmailError(Exception): """邮箱格式无效""" passdef validate_email(email): if "@" not in email: raise InvalidEmailError(f"'{email}' 不是有效邮箱地址")try: validate_email("bad-email")except InvalidEmailError as e: print(e) # 'bad-email' 不是有效邮箱地址
✅ 用途:在大型项目中区分业务异常与系统异常。
💻 今日实战:安全的用户输入处理器
✅ 今日小任务
- 修改第11天的温度转换模块,在 celsius_to_fahrenheit中添加类型检查,若输入非数字则抛出 TypeError。
- 思考题:else块和把代码放在 try块末尾有什么区别?
- 如果
try 块中后续代码可能抛异常,放在 else 中可确保它只在无异常时执行。 - 例如:
try 中打开文件,else 中处理内容——避免文件打开失败后还尝试处理。
📝 小结
| |
|---|
try | |
except | |
else | |
finally | |
raise | |
✅ 异常处理黄金法则:
- 具体优于笼统:捕获 ValueError 而非 Exception
- 不要忽略异常:至少记录日志资源用 finally或上下文管理器(with)释放
🎉 恭喜完成第12天!你已经掌握了 让 Python 程序健壮、可靠、用户友好的核心技能——异常处理!
继续加油,你的程序正变得越来越稳健!🛡️✨