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

7.2 Try Except语句


文章目录

  • 前言
  • 一、异常处理基础
    • 1. 基本语法结构
    • 2. 为什么要用try-except?
    • 3. 捕获特定异常
  • 二、完整的异常处理结构
    • 1. try-except-else-finally完整结构
    • 2. 捕获多个异常
  • 三、异常对象和自定义异常
    • 1. 获取异常信息
    • 2. 自定义异常
    • 3. 异常链
  • 四、实际应用场景
    • 1. 用户输入验证

前言

本文主要介绍异常处理基础、完整的异常处理结构、异常对象和自定义异常以及应用场景等知识点。


一、异常处理基础

1. 基本语法结构

pythontry:# 可能出错的代码代码块except异常类型:# 处理异常的代码处理代码

2. 为什么要用try-except?

python# 没有异常处理的代码会直接崩溃print("程序开始")# 这些代码可能会出错number=int("abc")# 这里会崩溃!print(f"数字是:{number}")print("程序结束")# 这行永远不会执行# 使用try-except可以让程序继续运行print("\n=== 使用try-except ===")print("程序开始")try:number=int("abc")# 这行会出错print(f"数字是:{number}")exceptValueError:print("错误:无法将字符串转换为整数")print("程序正常结束")# 这行会执行

3. 捕获特定异常

python# 示例1:处理除零错误defdivide_numbers(a,b):"""除法运算,处理除零错误"""try:result=a/breturnresultexceptZeroDivisionError:return"错误:除数不能为零"print("除法测试:")print(f"10 / 2 ={divide_numbers(10,2)}")print(f"10 / 0 ={divide_numbers(10,0)}")# 示例2:处理文件不存在错误defread_file(filename):"""读取文件,处理文件不存在的情况"""try:withopen(filename,'r',encoding='utf-8')asfile:content=file.read()returncontentexceptFileNotFoundError:returnf"错误:文件 '{filename}' 不存在"exceptPermissionError:returnf"错误:没有权限读取文件 '{filename}'"print("\n文件读取测试:")print(read_file("存在的文件.txt"))# 如果文件存在print(read_file("不存在的文件.txt"))# 文件不存在

二、完整的异常处理结构

1. try-except-else-finally完整结构

pythondefprocess_data(data_str):""" 完整的异常处理示例 try-except-else-finally结构 """result=Nonetry:print("尝试处理数据...")# 可能出错的代码number=float(data_str)result=number*2exceptValueError:print(f"错误:'{data_str}' 不是有效的数字")exceptTypeError:print("错误:输入类型不正确")else:# 只有当try块没有异常时才执行print(f"处理成功!原始数据:{data_str}, 结果:{result}")finally:# 无论是否发生异常都会执行print("清理资源...")print("-"*40)returnresult# 测试各种情况print("测试1:正常数据")process_data("10.5")print("测试2:无效数据")process_data("abc")print("测试3:None值")process_data(None)# finally的典型应用场景defread_config_file(filename):"""读取配置文件,确保文件被关闭"""file=Nonetry:file=open(filename,'r',encoding='utf-8')content=file.read()config=eval(content)# 危险!仅作示例returnconfigexceptFileNotFoundError:print(f"配置文件{filename}不存在")return{}exceptSyntaxError:print(f"配置文件{filename}格式错误")return{}finally:# 确保文件总是被关闭iffileandnotfile.closed:file.close()print(f"已关闭文件:{filename}")

2. 捕获多个异常

python# 方法1:多个except块defhandle_multiple_errors_1(data):"""多个except块处理不同异常"""try:# 多种可能的错误index=int(data)numbers=[10,20,30,40,50]result=numbers[index]/(index-2)# 可能除零returnf"结果:{result}"exceptValueError:return"错误:请输入有效的整数"exceptIndexError:return"错误:索引超出范围,有效索引是0-4"exceptZeroDivisionError:return"错误:除数不能为零(索引不能为2)"exceptExceptionase:# 捕获其他所有异常returnf"未知错误:{type(e).__name__}:{e}"# 测试test_cases=["abc","10","2","3","0"]fortestintest_cases:print(f"输入 '{test}':{handle_multiple_errors_1(test)}")# 方法2:一个except块捕获多个异常defhandle_multiple_errors_2(data):"""一个except块捕获多个异常"""try:index=int(data)numbers=[10,20,30,40,50]result=numbers[index]/(index-2)returnf"结果:{result}"except(ValueError,IndexError,ZeroDivisionError)ase:# 处理多种异常error_type=type(e).__name__iferror_type=="ValueError":return"错误:请输入有效的整数"eliferror_type=="IndexError":return"错误:索引超出范围"eliferror_type=="ZeroDivisionError":return"错误:除数不能为零"exceptExceptionase:returnf"其他错误:{e}"print("\n"+"="*40+"\n")fortestintest_cases:print(f"输入 '{test}':{handle_multiple_errors_2(test)}")

三、异常对象和自定义异常

1. 获取异常信息

pythondefanalyze_error(data):"""分析异常信息"""try:result=100/int(data)returnf"成功:{result}"exceptExceptionase:# 获取异常的详细信息print(f"异常类型:{type(e).__name__}")print(f"异常信息:{e}")print(f"异常参数:{e.args}")# 获取更多调试信息importtracebackprint("\n异常追踪:")traceback.print_exc()returnf"失败:{type(e).__name__}"print("分析错误信息:")print(analyze_error("0"))print("\n"+"="*40)print(analyze_error("abc"))

2. 自定义异常

python# 创建自定义异常类classValidationError(Exception):"""自定义验证错误"""def__init__(self,message,field=None):super().__init__(message)self.field=field self.message=messagedef__str__(self):ifself.field:returnf"{self.field}字段验证失败:{self.message}"returnf"验证失败:{self.message}"classInsufficientBalanceError(Exception):"""余额不足错误"""def__init__(self,balance,amount):super().__init__(f"余额不足: 当前余额{balance},需要{amount}")self.balance=balance self.amount=amount# 使用自定义异常defvalidate_user_input(username,password):"""验证用户输入"""ifnotusernameornotusername.strip():raiseValidationError("用户名不能为空",field="username")iflen(password)<6:raiseValidationError("密码长度至少6位",field="password")ifnotany(c.isdigit()forcinpassword):raiseValidationError("密码必须包含数字",field="password")print("验证通过!")returnTruedefwithdraw_money(balance,amount):"""取款操作"""ifamount<=0:raiseValueError("取款金额必须大于0")ifamount>balance:raiseInsufficientBalanceError(balance,amount)balance-=amountprint(f"取款成功!剩余余额:{balance}")returnbalance# 测试自定义异常print("测试1:用户验证")try:validate_user_input("","123")exceptValidationErrorase:print(f"捕获到验证错误:{e}")print(f"错误字段:{e.field}")print("\n测试2:取款操作")try:withdraw_money(1000,1500)exceptInsufficientBalanceErrorase:print(f"捕获到余额不足错误:{e}")print(f"当前余额:{e.balance}, 需要金额:{e.amount}")exceptValueErrorase:print(f"捕获到值错误:{e}")print("\n测试3:链式异常处理")try:try:validate_user_input("admin","123")exceptValidationErrorase:print(f"内层捕获:{e}")# 可以重新抛出异常raise# 重新抛出当前异常exceptValidationErrorase:print(f"外层捕获:{e}")

3. 异常链

pythondefprocess_data_file(filename):"""处理数据文件,演示异常链"""try:withopen(filename,'r')asfile:data=file.read()numbers=[int(x)forxindata.split()]average=sum(numbers)/len(numbers)returnaverageexceptFileNotFoundErrorase:# 添加更多上下文信息raiseFileNotFoundError(f"无法处理文件 '{filename}'")fromeexceptValueErrorase:# 转换异常类型raiseRuntimeError(f"文件 '{filename}' 包含无效数据")frome# 测试异常链try:result=process_data_file("nonexistent.txt")exceptExceptionase:print(f"主错误:{e}")print(f"原因:{e.__cause__}")# 显示完整的异常链importtracebackprint("\n完整异常链:")traceback.print_exc()

四、实际应用场景

1. 用户输入验证

pythondefget_valid_number(prompt,min_value=None,max_value=None):"""获取有效的数字输入"""whileTrue:try:user_input=input(prompt)number=float(user_input)# 验证范围ifmin_valueisnotNoneandnumber<min_value:raiseValueError(f"数字不能小于{min_value}")ifmax_valueisnotNoneandnumber>max_value:raiseValueError(f"数字不能大于{max_value}")returnnumberexceptValueErrorase:if"could not convert"instr(e):print(f"错误: '{user_input}' 不是有效的数字")else:print(f"错误:{e}")print("请重新输入...\n")# 使用print("用户输入验证示例:")age=get_valid_number("请输入年龄(0-150): ",min_value=0,max_value=150)temperature=get_valid_number("请输入温度(-50 to 60): ",min_value=-50,max_value=60)print(f"年龄:{age:.0f}岁")print(f"温度:{temperature:.1f}°C")

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

相关文章:

  • 为什么你的Dify总是截断文本?资深工程师告诉你真正原因
  • 钢结构定制与加工:如何选到靠谱供应商? - 工业品网
  • KTO知识蒸馏应用:从大模型向小模型传递能力
  • 2025年旅游景区智能系统生产厂排行榜,新测评精选旅游景区智能系统厂商推荐 - 工业设备
  • 2025旅游景区管理系统开发商TOP5权威推荐: - 工业设备
  • Soso操作系统:从零开始的类Unix系统体验之旅
  • Xilem内存管理完全指南:从入门到精通的高效技巧
  • 如何快速掌握机器人动力学与控制:面向工程师的完整学习指南
  • Office Tool Plus:终极Office部署解决方案免费指南
  • 企业AI智能体官网哪家更具竞争力?前景好+专业服务企业全解析 - mypinpai
  • 温度调节技巧:控制生成多样性
  • Glide.js可视化配置工具:告别手写代码,轮播开发效率提升80%
  • 【紧急预警】Dify access_token未做空值校验?你的系统可能已在风险边缘
  • 2025年靠谱钢格板品牌商/实力厂家排行榜,镀锌钢格板精选推荐 - myqiye
  • trainer模块替换:实现个性化训练逻辑
  • 2025年格栅板生产商推荐:平台格栅板优质厂家全解析 - 工业品牌热点
  • uWebSockets.js消息传输优化实战:攻克背压控制难题
  • Dify + Docker + Webhook集成测试实战(生产级稳定性验证方案)
  • 5个必学的Telegraf数据清洗技巧:让监控指标从混乱到有序
  • 为什么你的Dify触发器总失败?揭秘容器网络下的5大隐性故障源
  • 老照片修复训练数据集构建的完整实战手册
  • 2025年口碑好的鹤壁装修全包高满意度服务榜 - 品牌宣传支持者
  • 5分钟高效掌握Captura音频位深度转换技巧
  • React Native Windows开发环境配置全攻略:从零到精通
  • Python代码混淆工具跨版本兼容性深度解析
  • 1629个精选书源全面解析:提升阅读3.0应用体验的专业指南
  • 如何快速获取优质字体资源:苹方字体完整使用教程
  • 斐讯N1双系统重构指南:打造智能家庭控制中心的创新方案
  • 紧急预警:Dify未授权访问漏洞频发,3步完成关键修复
  • Pyarmor跨版本兼容性终极指南:从Python 2.7到3.13的完整解决方案