掌握【Python异常处理】:打造健壮代码的现代编程指南

 

目录

​编辑

1. 什么是异常?

知识点

示例

小李的理解

2. 常见的内置异常类型

知识点

示例

小李的理解

3. 异常机制的意义

知识点

示例

小李的理解

4. 如何处理异常

知识点

示例

小李的理解

5. 抛出异常

知识点

示例

小李的理解

6. Python内置异常类

知识点

示例​编辑

小李的理解

7. 自定义异常类

知识点

示例

小李的理解

结论


专栏:python学习笔记 

上一篇:Python文件操作

异常处理是编程中确保代码健壮性和无错误的关键方面。在本文中,我们将详细探讨Python异常处理的关键概念,每一步都分点详解,提供完整的代码示例和解析。

1. 什么是异常?

知识点

异常是在程序执行过程中发生的错误。当程序遇到无法处理的情况时,会生成异常。如果这些异常没有被捕捉并处理,程序将终止执行。Python中的异常处理机制允许程序捕捉这些异常,并采取适当的行动,以避免程序崩溃。

异常的种类有很多,例如:

  • SyntaxError:语法错误,是在编写代码时违反了Python的语法规则。
  • IndexError:试图访问超出列表范围的索引时引发。
  • IOError:输入/输出操作失败,例如试图打开不存在的文件。

示例

# 示例代码1:语法错误
Print('hello world')  # 语法错误,正确的写法是print('hello world')

这个例子展示了一个简单的语法错误,使用了大写的Print而不是正确的print。Python解释器检测到语法错误后,抛出SyntaxError异常并终止程序。

小李的理解

异常就像是程序运行中的“红灯”,某个地方出错了,需要修正才能继续。就像在开车时遇到红灯需要停下来一样,程序在遇到异常时也会停下来,提示我们检查并修正错误。

2. 常见的内置异常类型

知识点

Python有许多内置异常类型,用于处理不同类型的错误。了解这些常见的异常类型有助于编写更加健壮的代码。

  • SyntaxError:语法错误。
  • IndexError:索引超出范围。
  • IOError:输入/输出操作失败。

每种异常都有其特定的用途和触发条件。下面我们将通过示例代码详细了解每种异常的触发条件和处理方法。

示例

# 示例代码2:索引错误
a = [1, 2, 3]
print(a[100])  # 尝试访问列表中不存在的索引

 

这个例子展示了当试图访问超出列表范围的索引时会发生什么。这里,我们试图访问列表a中的第100个元素,但a只有3个元素,因此Python抛出IndexError异常。

小李的理解

这些内置异常就像不同类型的“红灯”,告诉我们具体出错的地方,比如“索引超出范围”就像是访问了不存在的地址。了解这些异常可以帮助我们快速定位和修正代码中的错误。

3. 异常机制的意义

知识点

异常处理机制的主要目的是将正常逻辑和错误处理逻辑分离。这种分离提高了代码的可读性和维护性。

在没有异常处理机制的编程语言中,错误处理通常通过返回值来实现。这会导致代码混乱,因为每个函数调用后都需要检查返回值。Python的异常处理机制通过使用tryexcept等关键字,使得错误处理更加直观和简洁。

示例

 

# C语言示例:混合错误处理和正常逻辑
int fd = socket(AF_INET, SOCK_STREAM, 0);
if (fd < 0) {perror("socket");return 1;
}
int ret = bind(fd, (struct sockaddr*)&addr, sizeof(addr));
if (ret < 0) {perror("bind");return 1;
}
ret = listen(fd, 10);
if (ret < 0) {perror("listen");return 1;
}
# Python示例:异常处理机制
try:sock = socket(AF_INET, SOCK_STREAM)sock.bind(ADDR)sock.listen(5)
except:print('error')  # 可以进行其他复杂的处理

这个例子展示了C语言和Python在处理错误时的不同。C语言中,每个函数调用后都需要检查返回值并处理错误,这会导致代码混乱。相比之下,Python通过异常处理机制,可以将正常逻辑和错误处理逻辑分离,使代码更简洁易读。

小李的理解

异常处理机制就像是把“红灯”处理逻辑分开,让我们专注于主要任务而不是处理错误。这样,我们的代码就像是一条清晰的道路,没有错误处理的干扰,使得主要逻辑更加清晰和易于维护。

4. 如何处理异常

知识点

在Python中,异常处理使用tryexceptelsefinally关键字。通过这些关键字,可以捕捉并处理异常,使程序能够在出现错误时继续运行。

  • try:包裹可能引发异常的代码块。
  • except:处理异常的代码块。
  • else:可选代码块,如果没有异常发生则执行。
  • finally:可选代码块,无论是否有异常都会执行,用于清理资源。

示例

 

# 示例代码4:基本异常处理
try:a = [1, 2, 3]print(a[100])
except IndexError as e:print(f"发生了索引错误: {e}")
else:print("没有错误发生")
finally:print("执行完毕")

在这个例子中,我们使用try块包裹可能引发异常的代码。except块捕捉并处理IndexError异常。如果没有发生异常,else块中的代码会被执行。无论是否发生异常,finally块中的代码都会被执行。

小李的理解

try块就像是试探性的操作,except块是处理“红灯”的地方,else块是顺利通行时的处理,finally块是无论如何都要完成的扫尾工作。这样,我们可以确保无论发生什么,程序都能安全地完成必要的清理工作。

5. 抛出异常

知识点

在某些情况下,我们需要在程序中主动抛出异常。可以使用raise关键字显式抛出异常。自定义异常可以帮助识别特定的错误情况。

示例

# 示例代码5:抛出和捕获自定义异常
class CustomError(Exception):passdef divide(x, y):if y == 0:raise CustomError('除数不能为零')return x / ytry:result = divide(1, 0)
except CustomError as e:print(f"错误: {e}")
else:print(f"结果是: {result}")

 

在这个例子中,我们定义了一个自定义异常CustomError,并在divide函数中使用raise关键字主动抛出这个异常。当y为零时,会抛出CustomError异常,并在except块中捕捉并处理。

小李的理解

raise关键字就像是自己设置“红灯”,以便在特定情况下发出警报。通过定义自定义异常,我们可以更好地控制程序中的特定错误情况,并提供有意义的错误信息。

6. Python内置异常类

知识点

Python提供了一系列内置异常类,这些异常类都继承自Exception类。了解这些异常类及其用途,可以帮助我们更好地处理各种错误情况。

  • ArithmeticError:数值计算错误的基类。
  • LookupError:查找失败错误的基类。
  • ValueError:函数接收到参数类型正确但值不合适时引发。

示例

 

在这个例子中,我们尝试将字符串'hello'转换为整数,这会引发ValueError异常。except块捕捉并处理这个异常,并打印出错误信息。

小李的理解

内置异常类是Python给我们的工具箱,用来处理各种常见的“红灯”情况。了解这些异常类的用途,可以帮助我们更快速地定位和修正代码中的错误。

7. 自定义异常类

知识点

通过继承Exception类,我们可以创建自定义的异常类,用于处理特定的错误条件。这种方法使我们能够定义特定的错误类型,并在需要时抛出和捕捉这些错误。

示例

# 示例代码7:自定义异常类
class NegativeNumberError(Exception):def __init__(self, value):self.value = valuedef square_root(x):if x < 0:raise NegativeNumberError(f"不能对负数求平方根: {x}")return x ** 0.5try:result = square_root(-1)
except NegativeNumberError as e:print(e)
else:print(f"结果是: {result}")

在这个例子中,我们定义了一个自定义异常类NegativeNumberError,并在square_root函数中使用raise关键字主动抛出这个异常。当x为负数时,会抛出NegativeNumberError异常,并在except块中捕捉并处理。

小李的理解

自定义异常类是我们自己的“红灯”,用来标记特定的错误情况,让我们可以更准确地处理问题。通过定义自定义异常,我们可以为程序添加更多的逻辑检查和错误处理机制,从而提高代码的健壮性和可维护性。

结论

通过逐步了解和实现Python中的异常处理机制,可以确保程序的健壮性和可维护性。使用tryexceptelsefinally块,可以编写出清晰且可维护的代码,有效管理错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/41836.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Springboot整合Jsch-Sftp

背景 开发一个基于jsch的sftp工具类&#xff0c;方便在以后的项目中使用。写代码的过程记录下来&#xff0c;作为备忘录。。。 Maven依赖 springboot依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-par…

codeforces 1633A

文章目录 1. 题目链接2. 题目代码正确代码错误代码 3. 题目总结 1. 题目链接 Div. 7 2. 题目代码 正确代码 #include<iostream> using namespace std; int main(){int testCase;cin >> testCase;while(testCase --){int ingeter;cin >> ingeter;if(!(inget…

SpringBoot彩蛋之定制启动画面

写在前面 在日常开发中&#xff0c;我们经常会看到各种各样的启动画面。例如以下几种 ① spring项目启动画面 ② mybatisplus启动画面 ③若依项目启动画面 还有很多各式各样好看的启动画面&#xff0c;那么怎么定制这些启动画面呢&#xff1f; 一、小试牛刀 ① 新建一个Spr…

SQL 之 concat_ws和concat的区别

concat_ws和concat都是用于连接字符串的函数&#xff0c;但它们在使用上有一些区别&#xff1a; 一、concat、concat_ws函数格式&#xff1a; concat格式&#xff1a; concat&#xff08;参数1,参数2,…参数n&#xff09;&#xff0c;如果要加’分隔符’直接写在 各参数中间就…

关于微信支付-商户平台:查询订单提示“查询失败:操作失败,请稍候重试”的分析

目录 引子 分析 应对 小结 引子 在开发和实施微信 JSAPI 支付的应用后&#xff0c;我们遇到了一些问题&#xff0c;订单的状态更新不正常&#xff0c;当然我们首先需要从自身寻找原因和完善解决问题的办法和方案。在支付的过程中&#xff0c;客户会给我们一些反馈&#xf…

Open-Sora1.2环境搭建推理测试

引子 前阵子写了一篇Open-Sora1.0环境搭建&推理测试&#xff08;Open-Sora1.0环境搭建&推理测试_自己搭建sora服务-CSDN博客&#xff0c;感兴趣的童鞋&#xff0c;请移步&#xff09;。Open-Sora1.1发布的时候&#xff0c;撇了一眼新闻。后面一转头&#xff0c;忘记这…

ARL联动AWVS实现自动化漏洞扫描

0x01 前言 很多场景下需要大范围的扫描漏洞和快速排查互联网暴露面的漏洞&#xff0c;需要使用这种自动化的手段&#xff0c;常规渗透测试的找互联网暴露面是&#xff0c;域名>子域名>IP>C段>端口&#xff0c;可以手动收集&#xff0c;也可以借助一些网络搜索引擎…

卡尔曼滤波Q和R怎么调

卡尔曼滤波器是一种有效的估计算法&#xff0c;主要用于在存在噪声的环境中估计动态系统的状态。它通过结合预测模型&#xff08;系统动态&#xff09;和观测数据&#xff08;包括噪声&#xff09;来实现这一点。在卡尔曼滤波中&#xff0c;调整过程噪声协方差矩阵 ( Q ) 和测量…

Kubernetes运维工程师必备:K8s 基础面试题精编(一)

Kubernetes运维工程师必备:K8s 基础面试题精编(一) 1. 什么是Kubernetes?2. Kubernetes如何实现容器编排?3. 说出k8s的常见资源对象?4. 什么是pod?5. Deployment介绍及使用?6. statefulesets介绍及使用?7. statefulesets和deployment区别?8. 什么是调度器(Scheduler…

The First项目报告:NvirWorld与区块链游戏的未来

根据官方公告&#xff0c;The Fisrt现货区将于2024年7月2日16:00上架NVIR/USDT交易对&#xff0c;NVIR是NvirWorld平台的原生代币。作为一个去中心化解决方案&#xff0c;NvirWorld为开发者提供了一个简化且适应性强的环境&#xff0c;旨在通过优化的扩展解决方案来降低交易成本…

docker 本地部署大模型(ollama)

docker 安装 ollama docker search ollama docker pull ollama/ollama###docker下载ollama部署 docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama### 下载模型 docker exec -it ollama ollama pull llama3### 交互式运行模型docker exec -i…

算法 —— 二分查找

目录 二分查找 在排序数组中查找元素的第一个和最后一个位置 搜索插入位置 x的平方根 山峰数组的峰顶索引 寻找峰值 搜索旋转排序数组中的最⼩值 点名 二分查找模板分为三种&#xff1a;1、朴素的二分模板 2、查找左边界的二分模板 3、查找右边界的二分模板&#xf…

【基于R语言群体遗传学】-12-超显性与次显性

欢迎先看前面的博客&#xff0c;再继续进行后面的内容&#xff1a; 群体遗传学_tRNA做科研的博客-CSDN博客 当杂合子的适应度超出纯合子的范围时&#xff0c;二倍体能够展现出更多令人着迷的选择实例。这种形式的一种是杂合子优势&#xff0c;或称为“超显性”&#xff0c;其…

【包邮送书】AIGC时代程序员的跃迁——编程高手的密码武器

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

无线麦克风哪个品牌音质最好,揭秘手机收音麦克风哪个牌子好!

随着全球直播和短视频行业的蓬勃发展&#xff0c;领夹麦克风因其便携性和出色的录音质量而备受青睐。用户在各种场合下追求清晰、真实的录音效果&#xff0c;领夹麦克风无疑是一个理想的选择。 然而&#xff0c;面对市场上琳琅满目的品牌和型号&#xff0c;想要挑选一款性能优…

C++和Python蚂蚁搬食和蚊虫趋光性和浮标机群行为算法神经网络

&#x1f3af;要点 &#x1f3af;机器人群行为配置和C行为实现&#xff1a;&#x1f58a;脚底机器人狭隘空间导航避让障碍物行为 | &#x1f58a;脚底机器人使用摄像头耦合共振&#xff0c;实现同步动作 | &#x1f58a;脚底机器群使用相机&#xff0c;计算彼此间“分子间势能…

WAIC2024 上海 | Gooxi 全面展示智算新成果,加速人工智能落地应用

浦江之畔&#xff0c;大咖云集&#xff1b;智能浪潮&#xff0c;奔涌不息。7月4日&#xff0c;被誉为人工智能界风向标的世界人工智能大会暨人工智能全球治理高级别会议在上海盛大召开&#xff0c;Gooxi此次携最新AI服务器以及解决方案参与&#xff0c;以算为擎赋能新质生产力&…

如何对待信息技术课上学生玩游戏现象

对待信息技术课上学生玩游戏的现象&#xff0c;需要采取一系列综合措施&#xff0c;既要防止学生分心&#xff0c;又要确保课堂的教学质量和学生的积极参与。以下是一些建议&#xff1a; 1. 明确课堂规则&#xff1a;在课程开始之初&#xff0c;明确告知学生课堂上不允许玩游戏…

【UE Lua】 快速入门(基础语法、与UE引擎的交互)

目录 0 引言1 基础语法1.1 变量和数据类型1.2 注释1.3 控制结构1.4 函数1.5 表&#xff08;Table&#xff09;1.6 元表&#xff08;Metatable&#xff09;1.7 字符串操作1.8 模块和包1.9 错误处理 2 数据结构 - 表2.1 表&#xff08;Table&#xff09;2.2 元表&#xff08;Meta…

「数据结构详解·十四」对顶堆

「数据结构详解一」树的初步「数据结构详解二」二叉树的初步「数据结构详解三」栈「数据结构详解四」队列「数据结构详解五」链表「数据结构详解六」哈希表「数据结构详解七」并查集的初步「数据结构详解八」带权并查集 & 扩展域并查集「数据结构详解九」图的初步「数据结构…