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

python基础入门:6.3异常处理机制

Python异常处理全面指南:构建健壮程序的关键技术

# 完整异常处理模板
def process_file(file_path):"""文件处理示例函数"""file = Nonetry:file = open(file_path, 'r', encoding='utf-8')data = json.load(file)if not data:raise EmptyDataError("文件内容为空")  # 自定义异常result = complex_processing(data)  # 可能抛出多种异常except FileNotFoundError as e:logging.error(f"文件不存在: {e}")raise  # 重新抛出异常except json.JSONDecodeError as e:raise InvalidFormatError("JSON格式错误") from eexcept EmptyDataError as e:logging.warning(e)return Noneelse:logging.info("文件处理成功")return resultfinally:if file is not None:try:file.close()except IOError as e:logging.error(f"关闭文件失败: {e}")
一、异常处理结构详解
  1. 完整结构流程图
开始
↓
try
├─ 可能抛出异常的代码
↓
except
├─ 捕获指定异常
↓
else (可选)
├─ 无异常时执行
↓
finally (可选)
└─ 始终执行的清理代码
  1. 执行顺序示例
def division_test(value):try:print("try块开始")result = 10 / valueexcept ZeroDivisionError:print("捕获除零错误")except TypeError:print("捕获类型错误")else:print("计算结果:", result)finally:print("finally块执行")# 测试用例
division_test(2)  # 正常执行
division_test(0)  # 触发ZeroDivisionError
division_test("a") # 触发TypeError
  1. 各代码块使用场景
代码块典型用途最佳实践
try包裹可能出错的代码尽量缩小代码范围
except处理特定异常明确指定异常类型,避免裸露except
else执行依赖try成功的操作将与try相关的后续操作放在else中
finally资源清理(文件/网络连接)确保关闭资源的代码必须放在此处
二、自定义异常与异常链
  1. 自定义异常类模板
class AppBaseError(Exception):"""应用基础异常类"""def __init__(self, message="应用错误", code=1000):self.code = codeself.message = messagesuper().__init__(self.message)class NetworkError(AppBaseError):"""网络相关异常"""def __init__(self, url, status_code):super().__init__(message=f"网络请求失败: {url} (状态码: {status_code})",code=2001)self.url = urlself.status_code = status_codeclass DatabaseError(AppBaseError):"""数据库操作异常"""ERROR_CODES = {1452: "外键约束失败",1062: "重复键值"}def __init__(self, sql, errcode):code = 3000 + errcodemsg = f"SQL执行错误: {self.ERROR_CODES.get(errcode, '未知错误')}"super().__init__(message=msg, code=code)self.sql = sql
  1. 异常链实践
def fetch_data():try:response = requests.get('https://api.example.com/data', timeout=5)response.raise_for_status()return response.json()except requests.RequestException as e:raise DataFetchError("数据获取失败") from e  # 保留原始异常信息try:data = fetch_data()
except DataFetchError as e:print(f"错误原因: {e}")print(f"原始异常: {e.__cause__}")  # 显示底层网络异常
三、断言与防御性编程
  1. 断言使用规范
def calculate_discount(price, discount):"""计算商品折扣价"""# 前置条件检查assert isinstance(price, (int, float)), "价格必须是数值"assert 0 <= discount <= 1, "折扣率应在0-1之间"# 业务逻辑discounted = price * (1 - discount)# 后置条件验证assert discounted <= price, "折后价不应超过原价"return discounted# 测试断言
try:calculate_discount(100, 0.2)  # 正常calculate_discount("100", 0.5) # 触发类型断言
except AssertionError as e:print(f"输入验证失败: {e}")
  1. 防御性编程技巧
def safe_divide(a, b):"""安全的除法运算"""# 输入验证if not isinstance(a, (int, float)) or not isinstance(b, (int, float)):raise TypeError("操作数必须是数值类型")# 边界条件检查if b == 0:raise ValueError("除数不能为零")# 类型转换result = float(a) / float(b)# 结果验证if math.isinf(result):raise OverflowError("计算结果溢出")return round(result, 4)
四、异常处理最佳实践
  1. 异常处理决策树
出现错误情况
↓
是否属于正常业务流程? → 是 → 使用返回码/状态标识
↓
否
↓
是否可恢复? → 是 → 捕获处理
↓
否
↓
抛出异常终止流程
  1. 异常日志规范
import logging
import tracebacklogger = logging.getLogger(__name__)try:risky_operation()
except (NetworkError, DatabaseError) as e:logger.error(f"操作失败 [代码:{e.code}]: {e.message}")
except Exception as e:logger.critical(f"未处理的异常: {str(e)}\n"f"堆栈跟踪: {traceback.format_exc()}")raise
  1. 性能优化建议
  • 避免在频繁执行的代码路径中使用try块
  • 将异常处理移到循环外部
  • 使用预检查替代异常捕获(LBYL vs EAFP)
# 低效方式
for num in numbers:try:value = 10 / numexcept ZeroDivisionError:value = 0# 高效方式
processed = []
for num in numbers:if num == 0:processed.append(0)else:processed.append(10/num)

异常处理反模式

# 错误1:吞噬所有异常
try:do_something()
except:pass# 错误2:过于宽泛的异常捕获
try:process_data()
except Exception as e:handle_error()# 错误3:重复的异常处理
try:file.read()
except IOError:file.close()try:file.write()
except IOError:file.close()# 正确方式:使用上下文管理器
with open('file.txt') as f:process(f)

调试建议

# 在开发环境启用详细调试
if DEBUG:import pdbpdb.set_trace()# 使用__debug__优化生产代码
if __debug__:print("调试信息")
else:logging.info("生产日志")
开始执行
可能出错?
使用try包裹
正常流程
发生异常?
匹配except块
记录日志
处理/转换异常
是否需要中断流程
抛出新异常
恢复执行
执行else块
正常返回结果
外层捕获处理
最终清理
结束

相关文章:

python基础入门:6.3异常处理机制

Python异常处理全面指南&#xff1a;构建健壮程序的关键技术 # 完整异常处理模板 def process_file(file_path):"""文件处理示例函数"""file Nonetry:file open(file_path, r, encodingutf-8)data json.load(file)if not data:raise EmptyDa…...

Mybatis快速入门与核心知识总结

Mybatis 1. 实体类&#xff08;Entity Class&#xff09;1.1 实体类的定义1.2 简化编写1.2.1 Data1.2.2 AllArgsConstructor1.2.3 NoArgsConstructor 2. 创建 Mapper 接口2.1 Param2.2 #{} 占位符2.3 SQL 预编译 3. 配置 MyBatis XML 映射文件&#xff08;可选&#xff09;3.1 …...

畅聊deepseek-r1,SiliconFlow 硅基流动注册+使用

文章目录 SiliconFlow 硅基流动注册使用注册创建API密钥使用网页端使用代码调用api调用支持的模型 SiliconFlow 硅基流动注册使用 注册 硅基流动官网 https://cloud.siliconflow.cn/i/XcgtUixn 注册流程 切换中文 ​ 邀请码&#xff1a; XcgtUixn 创建API密钥 账户管理 --&g…...

一个基于ESP32S3和INMP441麦克风实现音频强度控制RGB灯带律动的代码及效果展示

一个基于ESP32S3和INMP441麦克风实现音频强度控制RGB灯带律动的代码示例&#xff0c;使用Arduino语言&#xff1a; 硬件连接 INMP441 VCC → ESP32的3.3VINMP441 GND → ESP32的GNDINMP441 SCK → ESP32的GPIO 17INMP441 WS → ESP32的GPIO 18INMP441 SD → ESP32的GPIO 16RG…...

Springboot 中如何使用Sentinel

在 Spring Boot 中使用 Sentinel 非常方便&#xff0c;Spring Cloud Alibaba 提供了 spring-cloud-starter-alibaba-sentinel 组件&#xff0c;可以快速将 Sentinel 集成到你的 Spring Boot 应用中&#xff0c;并利用其强大的流量控制和容错能力。 下面是一个详细的步骤指南 …...

访问Elasticsearch服务 curl ip 端口可以 浏览器不可以

LINUX学习 在虚拟机上面的linux上面用docker 部署Elasticsearch项目后&#xff0c;在linux系统内部用curl ip 端口地址的形式可以访问到Elasticsearch。可以返回数据。 但是在本机的浏览器中输入ip 端口&#xff0c;会报错&#xff0c;找不到服务。 ping 和 trelnet均不通。 …...

Curser2_解除机器码限制

# Curser1_无限白嫖试用次数 文末有所需工具下载地址 Cursor Device ID Changer 一个用于修改 Cursor 编辑器设备 ID 的跨平台工具集。当遇到设备 ID 锁定问题时&#xff0c;可用于重置设备标识。 功能特性 ✨ 支持 Windows 和 macOS 系统&#x1f504; 自动生成符合格式的…...

人工智能与低代码如何重新定义企业数字化转型?

引言&#xff1a;数字化转型的挑战与机遇 在全球化和信息化的浪潮中&#xff0c;数字化转型已经成为企业保持竞争力和创新能力的必经之路。然而&#xff0c;尽管“数字化”听上去是一个充满未来感的词汇&#xff0c;落地的过程却往往充满困难。 首先&#xff0c;传统开发方式…...

arkTS基础

arkTS基础 // 变量声明 let hi: string hello; hi hello,world; // 常量声明 const hi: string hello;// ArkTS是一种静态类型语言&#xff0c;所有数据的类型都必须在编译时确定 // 如果一个变量或常量的声明包含了初始值&#xff0c;那么开发者就不需要显式指定其类型。…...

C++20中的std::atomic_ref

一、std::atomic_ref 我们在学习C11后的原子操作时&#xff0c;都需要提前定义好std::atomic变量&#xff0c;然后才可以在后续的应用程序中进行使用。原子操作的优势在很多场合下优势非常明显&#xff0c;所以这也使得很多开发者越来习惯使用原子变量。 但是&#xff0c;在实…...

四、自然语言处理_08Transformer翻译任务案例

0、前言 在Seq2Seq模型的学习过程中&#xff0c;做过一个文本翻译任务案例&#xff0c;多轮训练后&#xff0c;效果还算能看 Transformer作为NLP领域的扛把子&#xff0c;对于此类任务的处理会更为强大&#xff0c;下面将以基于Transformer模型来重新处理此任务&#xff0c;看…...

spring学习(使用spring加载properties文件信息)(spring自定义标签引入)

目录 一、博客引言。 二、基本配置准备。 &#xff08;1&#xff09;初步分析。 &#xff08;2&#xff09;初始spring配置文件。 三、spring自定义标签的引入。 &#xff08;1&#xff09;基本了解。 &#xff08;2&#xff09;引入新的命名空间&#xff1a;xmlns:context。 &…...

bigemap pro如何进行poi兴趣点搜索?

准备工具&#xff1a;BIGEMAP Pro是数据要素设计软件(DED),国产基础软件&#xff0c;大数据编辑、制图、多源数据要素类处理软件打开软件右上角选择分类搜索然后用矩形或者选择行政边界线选择需要查询的范围选中范围以后点击查询然后可以直接加载到地图然后图层右键数据导出矢量…...

Mybatis源码02 - 初始化基本过程(引导层部分)

初始化基本过程&#xff08;引导层部分&#xff09; 文章目录 初始化基本过程&#xff08;引导层部分&#xff09;一&#xff1a;初始化的方式及引入二&#xff1a;初始化方式-XML配置文件1&#xff1a;MyBatis初始化基本过程2&#xff1a;创建Configuration对象的过程2.1&…...

【Elasticsearch】bucket_sort

Elasticsearch 的bucket_sort聚合是一种管道聚合&#xff0c;用于对父多桶聚合&#xff08;如terms、date_histogram、histogram等&#xff09;的桶进行排序。以下是关于bucket_sort的详细说明&#xff1a; 1.基本功能 bucket_sort聚合可以对父聚合返回的桶进行排序&#xff…...

k8s证书过期怎么更新?

在 Kubernetes 集群中&#xff0c;证书过期可能导致集群不可用&#xff0c;尤其是 API Server、Controller Manager、Scheduler 等组件所使用的证书。为了恢复集群的正常运行&#xff0c;您需要更新这些证书。以下是更新 Kubernetes 证书的基本步骤&#xff1a; 1. 检查证书状…...

活动预告 |【Part 1】Microsoft 安全在线技术公开课:通过扩展检测和响应抵御威胁

课程介绍 通过 Microsoft Learn 免费参加 Microsoft 安全在线技术公开课&#xff0c;掌握创造新机遇所需的技能&#xff0c;加快对 Microsoft Cloud 技术的了解。参加我们举办的“通过扩展检测和响应抵御威胁”技术公开课活动&#xff0c;了解如何更好地在 Microsoft 365 Defen…...

AIGC-微头条爆款文案创作智能体完整指令(DeepSeek,豆包,千问,Kimi,GPT)

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列AIGC(GPT、DeepSeek、豆包、千问、Kimi)👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资…...

C# 比较两个List集合内容是否相同

在 C# 中&#xff0c;要比较两个 List<T> 集合的内容是否相同&#xff0c;可以通过以下几种方法&#xff1a; 一、非自定义类的元素比较 1. 使用 SequenceEqual 方法&#xff08;顺序和内容都相等&#xff09; 顺序和内容都相等&#xff1a;使用 SequenceEqual。 usin…...

vue2 多页面pdf预览

使用pdfjs-dist预览pdf&#xff0c;实现预加载&#xff0c;滚动条翻页。pdfjs的版本很重要&#xff0c;换了好多版本&#xff0c;终于有一个能用的 node 20.18.1 "pdfjs-dist": "^2.2.228", vue页面代码如下 <template><div v-loading"loa…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008&#xff1a;是version产品的大版本。 R006&#xff1a;是release产品特性版本。 C009&#xff1a;是通用版 B0014&#xff1a;是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存&#xff1a;1GB 以上 硬盘&#xf…...

SQL Server 触发器调用存储过程实现发送 HTTP 请求

文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...

第八部分:阶段项目 6:构建 React 前端应用

现在&#xff0c;是时候将你学到的 React 基础知识付诸实践&#xff0c;构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段&#xff0c;你可以先使用模拟数据&#xff0c;或者如果你的后端 API&#xff08;阶段项目 5&#xff09;已经搭建好&#xff0c;可以直接连…...

2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版

1.题目描述 2.思路 当前的元素可以重复使用。 &#xff08;1&#xff09;确定回溯算法函数的参数和返回值&#xff08;一般是void类型&#xff09; &#xff08;2&#xff09;因为是用递归实现的&#xff0c;所以我们要确定终止条件 &#xff08;3&#xff09;单层搜索逻辑 二…...

小智AI+MCP

什么是小智AI和MCP 如果还不清楚的先看往期文章 手搓小智AI聊天机器人 MCP 深度解析&#xff1a;AI 的USB接口 如何使用小智MCP 1.刷支持mcp的小智固件 2.下载官方MCP的示例代码 Github&#xff1a;https://github.com/78/mcp-calculator 安这个步骤执行 其中MCP_ENDPOI…...

Android屏幕刷新率与FPS(Frames Per Second) 120hz

Android屏幕刷新率与FPS(Frames Per Second) 120hz 屏幕刷新率是屏幕每秒钟刷新显示内容的次数&#xff0c;单位是赫兹&#xff08;Hz&#xff09;。 60Hz 屏幕&#xff1a;每秒刷新 60 次&#xff0c;每次刷新间隔约 16.67ms 90Hz 屏幕&#xff1a;每秒刷新 90 次&#xff0c;…...