news 2026/6/24 10:55:41

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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

  • 常见异常类型

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/24 10:52:04

误删微信聊天记录怎么办?全套官方恢复步骤一次性讲清

日常清理微信会话、更换手机、软件异常闪退时&#xff0c;很容易误删承载工作文件、家人合照、重要沟通内容的聊天记录。不少人丢失记录后盲目寻找工具&#xff0c;不仅无法找回数据&#xff0c;还存在隐私泄露风险。结合腾讯官方发布的数据存储规则与权威操作指南&#xff0c;…

作者头像 李华
网站建设 2026/6/24 10:42:42

OBS多平台直播插件:obs-multi-rtmp一键同步推流终极指南

OBS多平台直播插件&#xff1a;obs-multi-rtmp一键同步推流终极指南 【免费下载链接】obs-multi-rtmp OBS複数サイト同時配信プラグイン 项目地址: https://gitcode.com/gh_mirrors/ob/obs-multi-rtmp 你是否在为同时直播到多个平台而烦恼&#xff1f;每次切换平台都要重…

作者头像 李华
网站建设 2026/6/24 10:36:41

深圳地区等保2.0超融合方案选型指南与行业实践案例

在深圳&#xff0c;医疗、政务、金融等行业对信息系统的安全性要求极高&#xff0c;等级保护&#xff08;等保&#xff09;2.0标准已全面落地。超融合基础架构&#xff08;HCI&#xff09;凭借其简化运维、弹性扩展和内置安全能力&#xff0c;成为满足等保要求的主流选择。本文…

作者头像 李华
网站建设 2026/6/24 10:34:17

终极免费方案:3分钟解锁Steam创意工坊跨平台模组自由

终极免费方案&#xff1a;3分钟解锁Steam创意工坊跨平台模组自由 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否曾在Epic平台购买《盖瑞的模组》后&#xff0c;眼巴巴看…

作者头像 李华
网站建设 2026/6/24 10:24:06

前端开发福利:用 Grok 快速生成响应式 CSS 布局,到底有多高效?

写 CSS 响应式布局和调试 Grid 栅格&#xff0c;向来是前端开发中耗时且繁琐的环节。面对移动端、平板、折叠屏及 PC 端多终端适配&#xff0c;加上各类浏览器内核的兼容性差异&#xff0c;手写媒体查询&#xff08;Media Queries&#xff09;和弹性盒很容易顾此失彼。为了突破…

作者头像 李华