当前位置: 首页 > news >正文

Python:第11天:异常处理 —— 让程序不轻易崩溃

第11天:异常处理 —— 让程序不轻易崩溃

我们写的程序难免会遇到错误:用户输入了非数字内容、文件不存在、网络断开……
如果不对这些错误进行处理,程序就会崩溃(直接报错退出)。
今天来学习异常处理(Exception Handling),让程序在遇到错误时能够“优雅地”应对,而不是一崩了之。


🎯 今日目标

  • 理解什么是异常(Exception)

  • 掌握try-except语句的基本语法

  • 学会捕获特定类型的异常

  • 掌握elsefinally的用法

  • 学会主动抛出异常(raise

  • 了解常见的异常类型


💥 一、什么是异常?

异常是程序运行时发生的错误。当 Python 遇到它无法处理的情况时,就会抛出异常,如果没有被捕获,程序就会终止。

1.1 常见异常示例

python

# 1. 除以零 print(10 / 0) # ZeroDivisionError # 2. 访问不存在的列表索引 nums = [1, 2, 3] print(nums[5]) # IndexError # 3. 变量未定义 print(unknown) # NameError # 4. 类型不匹配 print("10" + 5) # TypeError # 5. 文件不存在 with open("不存在的文件.txt", "r") as f: # FileNotFoundError pass

运行结果(第一个错误就会停止):

text

ZeroDivisionError: division by zero

💡 一旦发生异常,程序就会立即停止,后面的代码不会执行。


🛡️ 二、try-except语句:捕获异常

2.1 基本语法

python

try: # 可能会出错的代码 可能存在异常的代码 except: # 出错后执行的代码 处理异常的代码

2.2 简单例子

python

try: num = int(input("请输入一个数字: ")) result = 10 / num print(f"结果是: {result}") except: print("输入有误,请确保输入的是非零数字")

运行示例:

text

请输入一个数字: 0 输入有误,请确保输入的是非零数字

💡 如果用户输入0或非数字,程序不会崩溃,而是输出友好的提示。


🎯 三、捕获特定类型的异常

上面的写法虽然简单,但会捕获所有异常。更好的做法是针对不同类型的异常做不同处理

3.1 捕获指定异常

python

try: num = int(input("请输入一个数字: ")) result = 10 / num print(f"结果是: {result}") except ValueError: print("❌ 错误:请输入有效的数字") except ZeroDivisionError: print("❌ 错误:不能除以零")

运行示例:

text

请输入一个数字: abc ❌ 错误:请输入有效的数字

text

请输入一个数字: 0 ❌ 错误:不能除以零

3.2 捕获多个异常(元组写法)

python

try: num = int(input("请输入一个数字: ")) result = 10 / num print(f"结果是: {result}") except (ValueError, ZeroDivisionError): print("❌ 输入错误:请输入非零的有效数字")

3.3 获取异常对象(获取具体错误信息)

python

try: num = int(input("请输入一个数字: ")) result = 10 / num print(f"结果是: {result}") except ValueError as e: print(f"❌ 类型错误: {e}") except ZeroDivisionError as e: print(f"❌ 数学错误: {e}")

运行示例:

text

请输入一个数字: abc ❌ 类型错误: invalid literal for int() with base 10: 'abc'

🔄 四、elsefinally

4.1else:没有异常时执行

python

try: num = int(input("请输入一个数字: ")) result = 10 / num except ValueError: print("❌ 请输入有效的数字") except ZeroDivisionError: print("❌ 不能除以零") else: print(f"✅ 计算结果: {result}") # 只有没有异常时才执行

运行示例:

text

请输入一个数字: 5 ✅ 计算结果: 2.0

4.2finally:无论是否异常都执行

finally中的代码一定会执行,通常用来做清理工作(如关闭文件、释放资源)。

python

try: file = open("data.txt", "r") content = file.read() print(content) except FileNotFoundError: print("❌ 文件不存在") finally: print("清理资源...") # file.close() # 注意:如果文件没打开,这里会报错,需要用 with 代替

💡 实际开发中,文件操作直接用with语句更安全,不需要手动finally

4.3 完整结构

python

try: # 可能出错的代码 except 异常类型1: # 处理异常1 except 异常类型2: # 处理异常2 else: # 没有异常时执行 finally: # 总是执行

🚀 五、主动抛出异常:raise

有时候我们希望主动触发一个异常,比如参数不符合要求时。

5.1 基本用法

python

def set_age(age): if age < 0 or age > 150: raise ValueError("年龄必须在 0-150 之间") print(f"年龄设置为: {age}") try: set_age(200) except ValueError as e: print(f"❌ 参数错误: {e}")

运行结果:

text

❌ 参数错误: 年龄必须在 0-150 之间

5.2 重新抛出异常

有时候捕获异常后,只想记录日志,然后继续把异常往上抛。

python

def divide(a, b): try: return a / b except ZeroDivisionError: print("记录日志:除数不能为0") raise # 重新抛出同一个异常 try: divide(10, 0) except ZeroDivisionError: print("主程序捕获到异常")

运行结果:

text

记录日志:除数不能为0 主程序捕获到异常

📋 六、常见异常类型一览

异常类型触发条件
ZeroDivisionError除以零
ValueError传入的值类型正确但内容无效(如int("abc")
TypeError操作或函数应用于错误类型(如"10" + 5
IndexError序列索引超出范围
KeyError字典中访问不存在的键
FileNotFoundError文件不存在
NameError使用未定义的变量
AttributeError访问对象不存在的属性或方法
SyntaxError语法错误(编译时触发,不是运行时异常)

💡 异常类型有继承关系,Exception是所有异常的基类。捕获Exception可以捕获所有异常。


🧪 七、综合示例:安全的计算器

python

# 第11天综合示例:带异常处理的四则运算 def safe_divide(a, b): """安全的除法,处理除零异常""" try: return a / b except ZeroDivisionError: return "错误:除数不能为0" def safe_int_input(prompt): """安全地获取整数输入""" while True: try: value = int(input(prompt)) return value except ValueError: print("❌ 请输入有效的整数,请重试") def safe_float_input(prompt): """安全地获取浮点数输入""" while True: try: value = float(input(prompt)) return value except ValueError: print("❌ 请输入有效的数字,请重试") def calculator(): """主计算器程序""" print("=" * 40) print(" 安全计算器(带异常处理)") print("=" * 40) while True: try: num1 = safe_float_input("请输入第一个数字: ") op = input("请输入运算符(+ - * /): ") num2 = safe_float_input("请输入第二个数字: ") if op == "+": result = num1 + num2 elif op == "-": result = num1 - num2 elif op == "*": result = num1 * num2 elif op == "/": result = safe_divide(num1, num2) else: print("❌ 不支持的运算符") continue if isinstance(result, str): print(f"❌ {result}") else: print(f"✅ {num1} {op} {num2} = {result}") except Exception as e: print(f"❌ 发生意外错误: {e}") # 询问是否继续 again = input("\n继续计算?(y/n): ").lower() if again != 'y': print("👋 再见!") break if __name__ == "__main__": calculator()

运行示例:

text

======================================== 安全计算器(带异常处理) ======================================== 请输入第一个数字: abc ❌ 请输入有效的数字,请重试 请输入第一个数字: 10 请输入运算符(+ - * /): / 请输入第二个数字: 0 ❌ 错误:除数不能为0 继续计算?(y/n): y 请输入第一个数字: 10 请输入运算符(+ - * /): + 请输入第二个数字: 5 ✅ 10.0 + 5.0 = 15.0 继续计算?(y/n): n 👋 再见!

🐛 八、新手常见错误及解决

错误现象错误代码示例解决方法
except没有捕获到异常except:但异常类型不匹配用更宽泛的Exception或添加具体类型
捕获了但没做任何处理except: pass至少打印日志或提示用户
忘记except的冒号except ValueError(没有冒号)加冒号:except ValueError:
finally里操作可能出错的资源finally: file.close()但文件没打开with代替手动管理
raise后没有重新处理raise后程序还是会崩溃确保调用方有对应的try-except
捕获了所有异常但掩盖了真实问题except: pass打印或记录异常信息便于调试

错误演示:捕获了异常但无法调试

python

try: num = int(input("输入数字: ")) print(10 / num) except: print("出错了") # 不知道具体是什么错

改进:

python

try: num = int(input("输入数字: ")) print(10 / num) except Exception as e: print(f"出错了: {type(e).__name__} - {e}") # 打印异常类型和详细信息

🎯 今日总结

今天你学会了:

  • 什么是异常(程序运行时的错误)

  • try-except捕获异常的基本语法

  • 捕获特定类型的异常(ValueError,ZeroDivisionError等)

  • else(没有异常时执行)和finally(始终执行)

  • 主动抛出异常(raise

  • 常见异常类型

  • 编写了带异常处理的安全计算器

http://www.jsqmd.com/news/1072296/

相关文章:

  • AutoGen 核心 Agent 聊天与对话模式
  • 2026 年企业级大模型API聚合网关选型实录:十款主流平台技术横评与场景匹配
  • 2026年最新选购参考:天学网和科大讯飞到底哪个更适合入手?
  • 三年累亏超3亿、现金流持续为负,思必驰凭什么再闯科创板?
  • 6个本科绿牌专业薪资大揭秘,3S专业就业差距在哪?
  • 告别GitHub英文困扰:5分钟实现中文界面的完整指南
  • AI教材写作必备:低查重AI工具,助你快速打造精品教材!
  • 2026年AI聚合平台大揭秘!哪家公司更胜一筹?
  • 手把手教你从0到1搭建一个AI Agent(智能体)
  • 深度解密:掌握微信数据库AES-256-CBC加密逆向工程核心技术
  • 工业品短视频推广/必打标+必触达+必搜到,工业品短视频推广整套降本打法
  • NS-USBLoader终极指南:3步搞定Switch游戏管理与系统破解
  • AI 时代软件工程巨变:瓶颈转移、角色模糊,未来何去何从?
  • 显卡驱动彻底清理终极指南:为什么你需要Display Driver Uninstaller?
  • 2026气液增压器品牌格局重塑:国际、台系与国产的三方博弈
  • 终极QQ音乐解密工具qmcdump:三步解锁加密音乐自由播放
  • 洛雪音乐六音音源终极修复指南:5分钟恢复完整音乐体验
  • 知名的GPRC5D(Detergent)膜蛋白厂家名声
  • 不再依赖L6和C2C12:云克隆大鼠骨骼肌细胞(SkMC)原代细胞为肌肉研究提供“未经改造”的真实视角
  • 如何快速上手AlienFX Tools:Alienware灯光、风扇和电源控制的终极指南
  • 论文修改记录优化方案,AI识别能力带来更清晰整理体验
  • Windows Cleaner终极指南:3分钟解决C盘爆红的免费神器
  • 5分钟掌握大麦抢票脚本:告别手动抢票的终极指南
  • 彻底搞懂 SLF4J 桥接模块:让老日志 API 乖乖听话
  • 口碑优良的贴标机厂家,高效生产背后的秘密
  • NS-USBLoader终极指南:3分钟搞定Switch文件传输与RCM注入
  • Altium Designer 在PCB布局时,如何隐藏器件位号丝印
  • 塔米德数智科技本土: AI 全域营销服务商,解析 GEO 优化落地价值
  • Windows Cleaner终极指南:如何快速解决C盘空间不足的完整方案
  • OBS多平台直播插件:obs-multi-rtmp一键同步推流终极指南