当前位置:首页>python>【跟着AI学Python】第12天:异常处理

【跟着AI学Python】第12天:异常处理

  • 2026-08-26 07:59:14
【跟着AI学Python】第12天:异常处理

【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
捕获并处理异常
仅当 try 中发生异常时执行
else
无异常时执行
仅当 try成功完成(无异常)时执行
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)
  • 避免裸 except:
  • 记录异常信息(as e)

📘 五、常见内置异常类型

异常
触发场景
示例
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' 不是有效邮箱地址

✅ 用途:在大型项目中区分业务异常与系统异常。


💻 今日实战:安全的用户输入处理器


✅ 今日小任务

  1. 修改第11天的温度转换模块,在 celsius_to_fahrenheit中添加类型检查,若输入非数字则抛出 TypeError。
  1. 思考题:else块和把代码放在 try块末尾有什么区别?

💡 答案:

    • 如果 try 块中后续代码可能抛异常,放在 else 中可确保它只在无异常时执行。
    • 例如:try 中打开文件,else 中处理内容——避免文件打开失败后还尝试处理。

📝 小结

关键字
用途
try
包裹可能出错的代码
except
捕获并处理特定异常
else
无异常时执行(成功路径)
finally
无论是否异常都执行(清理资源)
raise
主动抛出异常

✅ 异常处理黄金法则:

  1. 具体优于笼统:捕获 ValueError 而非 Exception
  2. 不要忽略异常:至少记录日志资源用 finally或上下文管理器(with)释放
3.用异常表示“异常情况”,而非控制流程

🎉 恭喜完成第12天!你已经掌握了 让 Python 程序健壮、可靠、用户友好的核心技能——异常处理!

继续加油,你的程序正变得越来越稳健!🛡️✨

最新文章

随机文章