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

Python中的异常处理:try-except-finally详解与自定义异常类

Python中的异常处理:try-except-finally详解与自定义异常类

在Python编程中,异常处理是确保程序健壮性和可靠性的重要部分。当程序遇到无法预料的错误时,异常处理机制能够防止程序崩溃,并允许我们采取适当的措施来解决问题。本文将详细解释try-except-finally语句块的作用和用法,并讨论如何自定义异常类以及如何在程序中优雅地处理异常。

一、try-except-finally语句块的作用和用法

try-except-finally语句块是Python中用于异常处理的基本结构。其中,try块包含可能会引发异常的代码,except块用于捕获并处理这些异常,而finally块则无论是否发生异常都会执行。

1. try块

try块中包含了可能引发异常的代码。当这些代码执行时,如果发生了异常,Python解释器会立即停止当前代码的执行,并查找能够处理该异常的except块。

2. except块

except块用于捕获并处理异常。你可以指定要捕获的异常类型,或者使用多个except块来捕获不同类型的异常。当try块中的代码引发异常时,Python解释器会查找与异常类型匹配的except块,并执行其中的代码。

示例:

try:# 尝试执行的代码result = 10 / 0  # 这会引发一个ZeroDivisionError异常
except ZeroDivisionError:# 处理ZeroDivisionError异常的代码print("不能除以零!")
except Exception as e:# 处理其他异常的代码print(f"发生了一个异常: {e}")

在上面的示例中,如果try块中的代码引发了ZeroDivisionError异常,那么第一个except块中的代码将被执行。如果引发了其他类型的异常,那么第二个except块中的代码将被执行。

3. finally块

finally块无论是否发生异常都会执行。它通常用于执行一些清理工作,如关闭文件、释放资源等。

示例:

try:# 尝试执行的代码f = open('example.txt', 'r')# ... 读取文件的操作 ...
except FileNotFoundError:# 处理FileNotFoundError异常的代码print("文件未找到!")
finally:# 无论是否发生异常都会执行的代码if 'f' in locals() and not f.closed:f.close()

在上面的示例中,无论是否发生异常,finally块中的代码都会执行,以确保文件被正确关闭。

二、自定义异常类

除了处理Python内置的异常外,你还可以定义自己的异常类。自定义异常类通常继承自内置的Exception类或其子类。

示例:

class MyCustomError(Exception):"""自定义异常类"""def __init__(self, message):self.message = messagedef __str__(self):return f"MyCustomError: {self.message}"# 使用自定义异常类
try:raise MyCustomError("这是一个自定义异常")
except MyCustomError as e:print(e)

在上面的示例中,我们定义了一个名为MyCustomError的自定义异常类,它继承自Exception类。在try块中,我们使用raise语句抛出了一个MyCustomError异常,并在except块中捕获并处理它。

三、优雅地处理异常

优雅地处理异常意味着在编写代码时要考虑各种可能的异常情况,并采取相应的措施来确保程序的稳定性和可靠性。以下是一些建议:

  1. 避免使用空的except:空的except块会捕获所有类型的异常,这可能导致你错过重要的错误信息。最好指定要捕获的异常类型,或者使用多个except块来捕获不同类型的异常。

  2. 记录异常信息:在except块中,使用日志记录工具(如logging模块)记录异常信息。这有助于你诊断问题并追踪异常的来源。

  3. 提供有用的错误消息:在自定义异常类中,确保__str__方法返回有用的错误消息。这将帮助用户或开发者理解发生了什么错误以及如何解决它。

  4. 使用finally块进行清理:在finally块中执行必要的清理工作,如关闭文件、释放资源等。这可以确保即使在发生异常的情况下,程序也能正确地释放资源。

  5. 避免过度使用异常:虽然异常处理是一种强大的工具,但过度使用它可能导致代码结构复杂且难以维护。在设计程序时,应优先考虑使用正常的控制流(如条件语句和循环)来处理常见情况,而将异常处理作为处理异常情况的一种手段。

  6. 使用上下文管理器(with语句):Python的with语句与上下文管理器(实现了__enter____exit__方法的对象)结合使用,可以自动处理资源的分配和释放。这对于需要打开和关闭文件、连接数据库等资源的操作特别有用。使用with语句可以确保即使在发生异常的情况下,资源也能被正确释放。

  7. 区分检查型异常和编程错误:检查型异常(如FileNotFoundErrorValueError)通常是由于程序外部的条件(如用户输入或文件不存在)导致的。对于这类异常,应该提供清晰的错误消息,并可能要求用户进行纠正。而编程错误(如语法错误或逻辑错误)则应该通过代码审查和测试来避免,而不是依赖异常处理来捕获。

  8. 文档化异常:在编写代码时,确保在文档(如docstring)中说明可能会引发哪些异常,以及为什么。这将帮助其他开发者更好地理解你的代码,并在需要时处理这些异常。

  9. 避免在循环中使用异常控制流程:虽然可以使用异常来控制循环的流程(例如,通过引发一个特定的异常来提前退出循环),但这通常不是最佳实践。使用更常规的循环控制结构(如breakcontinue)通常更清晰、更易读。

  10. 学习并遵循最佳实践:Python社区有许多关于异常处理的最佳实践和建议。通过阅读和学习这些资源,你可以了解如何更有效地使用异常处理来提高你的代码质量。

四、总结

异常处理是Python编程中不可或缺的一部分。通过合理地使用try-except-finally语句块、自定义异常类以及遵循最佳实践,你可以编写出更加健壮、可靠且易于维护的代码。记住,异常处理应该被视为一种工具,而不是解决问题的唯一手段。在编写代码时,应优先考虑使用正常的控制流来处理常见情况,并将异常处理作为处理异常情况的一种手段。

相关文章:

Python中的异常处理:try-except-finally详解与自定义异常类

Python中的异常处理:try-except-finally详解与自定义异常类 在Python编程中,异常处理是确保程序健壮性和可靠性的重要部分。当程序遇到无法预料的错误时,异常处理机制能够防止程序崩溃,并允许我们采取适当的措施来解决问题。本文…...

vscode软件上安装 Fitten Code插件及使用

一. 简介 前面几篇文章学习了 Pycharm开发工具上安装 Fitten Code插件,以及 Fitten Code插件的使用。 Fitten Code插件是是一款由非十大模型驱动的 AI 编程助手,它可以自动生成代码,提升开发效率,帮您调试 Bug,节省…...

人工智能小作业

1.问题 将下列句子用一阶谓词形式表示: (1)雪是白的。 (2)数a和数b之和大于数c。 (3)201班的学生每人都有一台笔记本电脑。 2.答案 句子(1)“雪是白的”可以表示为: White(雪)。 句子(2)“数a和数b…...

程序员搞副业一些会用到的工具

微信号采集(爬虫)技术的选型 那么,我们应该使用什么技术来从庞大的网页内容中自动筛选和提取微信号呢?答案就是:数据采集技术,也就是爬虫技术。 然而,数据采集技术种类繁多,我们具体应该采用哪一个呢&…...

k8s更改master节点IP

背景 搭建集群的同事未规划网络,导致其中有一台master ip是192.168.7.173,和其他集群节点的IP192.168.0.x或192.168.1.x相隔太远,现在需要对网络做整改,方便管理配置诸如绑定限速等操作。 master节点是3节点的。此博客属于事后记…...

c++【入门】已知一个圆的半径,求解该圆的面积和周长?

限制 时间限制 : 1 秒 内存限制 : 128 MB 已知一个圆的半径,求解该圆的面积和周长 输入 输入只有一行,只有1个整数。 输出 输出只有两行,一行面积,一行周长。(保留两位小数)。 令pi3.1415926 样例…...

c#通过sqlsugar查询信息并日期排序

c#通过sqlsugar查询信息并日期字段排序 public static List<Sugar_Get_Info_Class> Get_xml_lot_xx(string lot_number){DBContext<Sugar_Get_Info_Class> db_data DBContext<Sugar_Get_Info_Class>.OpDB();Expression<Func<Sugar_Get_Info_Class, b…...

使用 Qwen-Agent 将 8k 上下文记忆扩展到百万量级

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 汇总合集…...

Vyper重入漏洞解析

什么是重入攻击 Reentrancy攻击是以太坊智能合约中最具破坏性的攻击之一。当一个函数对另一个不可信合约进行外部调用时&#xff0c;就会发生重入攻击。然后&#xff0c;不可信合约会递归调用原始函数&#xff0c;试图耗尽资金。 当合约在发送资金之前未能更新其状态时&#…...

53.ReentrantLock原理

ReentrantLock使用 ReentrantLock 实现了Lock接口&#xff0c; 内置了Sync同步器继承了AbstractQueuedSynchronizer。 Sync是抽象类&#xff0c;有两个实现NonfairSync非公平&#xff0c;FairSync公平。 所以ReentrantLock有公平锁和非公平锁。默认是非公平锁。 public sta…...

“论边缘计算及应用”必过范文,突击2024软考高项论文

论文真题 边缘计算是在靠近物或数据源头的网络边缘侧&#xff0c;融合网络、计算、存储、应用核心能力的分布式开放平台(架构)&#xff0c;就近提供边缘智能服务。边缘计算与云计算各有所长&#xff0c;云计算擅长全局性、非实时、长周期的大数据处理与分析&#xff0c;能够在…...

浅谈安全用电管理系统对重要用户的安全管理

1用电安全管理的重要性   随着社会经济的不断发展&#xff0c;电网建设力度的不断加大&#xff0c;供电的可靠性和供电质量日益提高&#xff0c;电网结构也在不断完善。但在电网具备供电的条件下&#xff0c;部分高危和重要电力用户未按规定实现双回路电源线路供电&#xff1…...

Docker的资源限制

文章目录 一、什么是资源限制1、Docker的资源限制2、内核支持Linux功能3、OOM异常4、调整/设置进程OOM评分和优先级4.1、/proc/PID/oom_score_adj4.2、/proc/PID/oom_adj4.3、/proc/PID/oom_score 二、容器的内存限制1、实现原理2、命令格式及指令参数2.1、命令格式2.2、指令参…...

MongoDB $rename 给字段一次重新命名的机会

学习mongodb&#xff0c;体会mongodb的每一个使用细节&#xff0c;欢迎阅读威赞的文章。这是威赞发布的第58篇mongodb技术文章&#xff0c;欢迎浏览本专栏威赞发布的其他文章。 在日常编写程序过程中&#xff0c;命名错误是经常出现的错误。拼写错误的单词&#xff0c;大小写字…...

OnlyOwner在Solidity中是一个修饰符,TypeError:

目录 OnlyOwner在Solidity中是一个修饰符 TypeError: Data location must be "memory" or "calldata" for parameter in function, but none was given. function AddDOm (address dataOwnermAddress, string dataProduct, string dataNotes) OnlyOwner …...

数据Ant-Design-Vue动态表头并填充

Ant-Design-Vue是一款基于Vue.js的UI组件库&#xff0c;广泛应用于前端开发中。在Ant-Design-Vue中&#xff0c;提供了许多常用的组件&#xff0c;包括表格组件。表格组件可以方便地展示和处理大量的数据。 在实际的开发中&#xff0c;我们经常会遇到需要根据后台返回的数据动…...

验证码案例

目录 前言 一、Hutool工具介绍 1.1 Maven 1.2 介绍 1.3 实现类 二、验证码案例 2.1 需求 2.2 约定前后端交互接口 2.2.1 需求分析 2.2.2 接口定义 2.3 后端生成验证码 2.4 前端接收验证码图片 2.5 后端校验验证码 2.6 前端校验验证码 2.7 后端完整代码 前言…...

python身份证ocr接口功能免费体验、身份证实名认证接口

翔云人工智能API开放平台提供身份证实名认证接口、身份证识别接口&#xff0c;两者的相结合可以实现身份证的快速、精准核验&#xff0c;当用户在进行身份证实名认证操作时&#xff0c;仅需上传身份证照片&#xff0c;证件识别接口即可快速、精准的对证件上的文字信息进行快速提…...

屏幕空间反射技术在AI绘画中的作用

在数字艺术和游戏开发的世界中&#xff0c;真实感渲染一直是追求的圣杯。屏幕空间反射&#xff08;Screen Space Reflection&#xff0c;SSR&#xff09;技术作为一种先进的图形处理手段&#xff0c;它通过在屏幕空间内模拟光线的反射来增强场景的真实感和视觉冲击力。随着人工…...

JDK下载安装Java SDK

Android中国开发者官网 Android官网 (VPN翻墙) 通过brew命令 下载OracleJDK(推荐) 手动下载OracleJDK(不推荐) oracle OracleJDK下载页 查找硬件设备是否已存在JDK环境 oracle官网 备注&#xff1a; JetPack JavaDevelopmentKit Java开发的系统SDK OpenJDK 开源免费SDK …...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...