Python中的错误处理 - 使用try、except、else和finally进行解释,并附带代码示例

最近,我的经理委派我创建一个自动报告。我设计的报告非常简单。它包括一些来自数据库的数字和一些基本的数学运算。我很兴奋最终可以向公司展示我的惊人的Python技能。

我完成并交付了产品。一切都很顺利。至少,直到大约两周后。我的报告由于除以零错误而随机失败了。来了个笑声轨道。

我的短篇故事缺少细节,但应该强调在编写程序时处理边界情况和错误的重要性。这份报告本应是展示我的Python技能的机会。然而,它却变成了一个有点尴尬的时刻。

所以,让我们花点时间学习使用Python标准库进行基本的错误处理。我将重点介绍一些你需要开始的东西。

在开始处理异常之前,你应该对Python基础知识有很好的掌握。你需要知道为什么会抛出异常才能处理它们!

(本文视频讲解:java567.com)

我们将介绍以下内容:

  1. Python中的Try和Except语句
  2. 使用Else子句进行条件执行
  3. 内置异常
  4. 自定义异常
  5. 性能考虑

Python中的Try和Except语句

tryexcept语句是处理异常的主要方法。它们的形式如下:

x = 0
try:print(5 / x)
except ZeroDivisionError:print("出错了")# 出错了

让我们来分析上面的代码,以确保我们理解一致:

  1. 第1行将值0赋给变量x
  2. 第2行和第3行打开一个try子句,并尝试将5除以变量x
  3. 第4行和第5行打开一个except子句,用于任何ZeroDivisionError,并指示程序在尝试将任何东西除以0时打印一条消息

你可能已经注意到了问题。我的变量x的值是0,我试图将5除以x。世界上最好的数学家也不能除以0,Python也不能。那么会发生什么呢?

如果我们不处理错误,程序在尝试将5除以x时会立即终止。由于程序没有明确的指示如何处理异常,所以我们在第4行创建了except子句,并提供了程序在尝试将某些东西除以0时要采取的步骤。

这就是处理异常的整个思想:当程序遇到无法简单忽略的错误时,你需要告诉程序该怎么做。让我们看看tryexcept子句是如何工作的。

解析Try语句

TryExcept语句遵循一种模式,允许你可靠地处理代码中的问题。我们来看看这个模式。

首先,try子句中的代码尝试执行。

接下来,我们有三种可能性:

Try子句中没有错误

如果try子句中的代码没有任何错误,程序将:

  1. 执行try子句
  2. 跳过所有except子句
  3. 继续正常运行
x = 1
try:print(5 / x)
except ZeroDivisionError:print("出错了")print("我在try子句之后执行!")# 5.0
# 我在try子句之后执行!

你可以看到,在这个修改后的示例中,try子句(第3行和第4行)没有问题。代码将执行,except子句将被跳过,并且程序将在tryexcept语句结束后继续执行。

Try子句中有错误并且指定了异常

如果try子句中的代码确实引发异常并且在任何except关键字后指定了异常类型,程序将:

  1. 跳过try子句中剩余的代码
  2. 执行匹配的except子句中的任何代码
  3. 继续正常运行
x = 0
try:print(5 / x)
except:print("出错了")print("我在try子句之后执行!")# 出错了
# 我在try子句之后执行!

回到我的第一个例子,我将我们的变量x改回了值0,并尝试将5除以x。这会产生一个ZeroDivisionError。由于我的except语句指定了这种类型的异常,所以该子句中的代码在程序继续正常运行之前执行。

Try子句中有错误但未指定异常

最后,如果程序在try子句中引发了异常,但在任何except语句中未指定异常,那么程序将:

  1. 停止执行程序并抛出错误
x = 0
try:print(5 / y)
except:print("出错了")print("我在try子句之后执行!")# NameError: name 'y' is not defined

在上面的示例中,我试图将5除以变量y,但该变量不存在。这会引发一个NameError。我没有告诉程序如何处理NameError,所以唯一的选择就是终止程序。

清理工作

Tryexcept是处理错误的主要工具,但你可以使用的一个可选子句是finallyfinally子句将始终执行,无论是否发生错误。

x = 0
try:print(5 / x)
except ZeroDivisionError:print("我是except子句!")
finally:print("我是finally子句!")print("我在try子句之后执行!")# 我是except子句!
# 我是finally子句!
# 我在try子句之后执行!

在这个例子中,我创建了我们喜欢的ZeroDivisionError。你可以看到执行顺序是:

  1. except子句
  2. finally子句
  3. 之后的任何代码

一旦我们修复try子句不再引发错误,你仍然会看到类似的执行顺序。except子句不再运行,try子句将执行。

x = 1
try:print(5 / x)
except ZeroDivisionError:print("我是except子句!")
finally:print("我是finally子句!")print("我在try子句之后执行!")# 5.0
# 我是finally子句!
# 我在try子句之后执行!

你会注意到唯一的区别是try子句成功执行,因为没有抛出异常。finally子句和之后的代码会像你预期的那样执行。

这对于一些情况很有用,当你想要无论tryexcept子句的结果如何都要进行清理时。关闭连接、关闭文件和记录日志等操作都是finally子句的很好候选对象。

使用Else子句进行条件执行

另一个可选子句是else子句。else子句很简单:如果try子句中的代码执行时没有抛出错误,那么else子句中的代码也将执行。

x = 1
try:print(5 / x)
except ZeroDivisionError:print("我是except子句!")
else:print("我是else子句!")
finally:print("我是finally子句!")print("我在try子句之后执行!")# 5.0
# 我是else子句!
# 我是finally子句!
# 我在try子句之后执行!

这个例子的执行顺序是:

  1. try子句
  2. else子句
  3. finally子句
  4. 之后的任何代码

如果在try子句中出现异常或错误,else子句将被忽略。

x = 0
try:print(5 / x)
except ZeroDivisionError:print("我是except子句!")
else:print("我是else子句!")
finally:print("我是finally子句!")print("我在try子句之后执行!")# 我是except子句!
# 我是finally子句!
# 我在try子句之后执行!

内置异常

到目前为止,你已经看到我写了两种不同的命名异常:NameErrorZeroDivisionError。如果我需要其他异常呢?

Python标准库中有一整套异常列表。这些异常几乎可以满足你处理任何错误或异常的需求。

以下是一些可能很重要的异常:

  • KeyError – 在字典中找不到键
  • IndexError – 在可迭代对象上索引超出范围
  • TypeError – 将函数或操作用于错误类型的对象
  • OSError – 一般的操作系统错误

还有很多其他的异常,可以在Python文档中找到。我鼓励你去看看。你不仅会更擅长处理错误,还会探索你的Python程序可能真正出错的地方。

自定义异常

如果你需要扩展功能,还可以定义自定义异常。

class FooError(Exception):def __init__(self, message):self.message = messagedef foo(self):print("bar")

在上面的示例中,我创建了一个新类,并将其扩展自异常类。现在,我可以编写自定义功能,并像对待其他对象一样处理此异常。

try:raise FooError("这是一个测试错误")
except FooError as e:e.foo()# bar

这里,我故意引发了我的新FooError。我捕获了FooError,并给它起了别名e。现在,我可以访问我在创建的类中内置的foo()方法。

这为处理错误提供了一系列可能性。自定义日志记录、更深入的跟踪或任何你需要的其他功能都可以编码和创建。

性能考虑

现在你已经了解了tryexcept和异常对象的基础知识,你可以开始考虑在你的代码中使用它们来优雅地处理错误。但是,代码性能会受到多大影响呢?

简短的答案是没有。随着Python 3.11的发布,当没有抛出异常时,使用tryexcept语句几乎不会减慢速度。

捕获错误确实会导致一些减速。但总的来说,捕获这些错误总比整个程序崩溃好。

在Python的早期版本中,使用tryexcept子句确实会导致一些额外的执行时间。如果你不是最新的,请记住这一点。

总结

感谢你阅读到这里。你的未来自己和客户会为你的错误处理感谢你。

我们讨论了tryexceptelsefinally子句及其执行顺序,以及在什么情况下它们被执行。我们还复习了创建自定义异常的基础知识。

最重要的是要记住,tryexcept子句是捕获错误的主要方式,你应该在有风险、容易出错的代码中使用它们。

此外,请记住,捕获错误将使你的代码更加弹性,并让你看起来更像一个优秀的程序员。

(本文视频讲解:java567.com)

Error Handling in Python – try, except, else, & finally Explained with Code Examples

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

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

相关文章

Linux使用C语言实现Socket编程

Socket编程 这一个课程的笔记 相关文章 协议 Socket编程 高并发服务器实现 线程池 网络套接字 socket: (电源)插座(电器上的)插口,插孔,管座 在通信过程中, 套接字是成对存在的, 一个客户端的套接字, 一个…

PUBG绝地求生更新后无法启动/更新后卡顿?3个解决方法分享

在绝地求生中,团队协作也是非常重要的一点。咱们可以运用strong标签来着重“团队协作”。与队友紧密配合、彼此援助,一起拟定战术和战略,将会大大提高在游戏中获得成功的几率。在绝地求生中获得成功并不简单,但只需咱们把握了一些…

linux的io的知识大全

C语言的io操作 写文件 #include<stdio.h> #include<string.h>#define FILE_NAME "log.txt" int main() {FILE * fp fopen(FILE_NAME, "w");if(fpNULL){printf("fopen error!\n");}const char* msg "hello zk\n";int c…

北邮通报学生联名举报导师事件,导师PUA学生,学生只有压榨它

诸葛亮为激司马懿出战&#xff0c;派使者送给他女人的衣服&#xff0c;司马懿欣然接受后问使者&#xff1a;“你们家丞相都管些什么呀&#xff1f;” 使者回答道&#xff1a;“我们丞相从行军布阵到饮食起居&#xff0c;无一不亲自过问。” 司马懿听到心中大喜&#xff0c;心想…

【ARM Coresight SOC-600 -- ETF Flushin无法接收到 CTI 发出 triggerout 信号问题分析】

请阅读【嵌入式开发必备专栏 】 文章目录 问题背景波形分析问题背景 在做验证的时候,准备通过 CTI2 给 SOC 上的 ETF 触发一个 flushin 动作,然后stop住 formatter,结果一致发现没有成功,接下来就是分析的过程了。 首先检查了代码,没有发现代码有什么问题(一般自己写的代…

学习大数据,所需要的java(Maven)基础(1)

文章目录 使用Maven的优势第三方jar包添加第三方jar包获取jar包之间的依赖关系jar包之间的冲突处理将项目拆分成多个工程模块 实现项目的分布式部署Maven是什么自动化构建工具构建的概念构建环节自动化构建 Maven如何使用安装Maven核心程序maven联网问题Maven中的settings配置在…

Linux下批量的批量操作

批量删除docker 镜像 docker images | grep ent-form-web |awk ‘{print $3}’ | xargs docker rmi docker images: 列出所有的docker 镜像 docker images | grep ent-form-web : 选取出结果带 ent-form-web的信息 docker images | grep ent-form-web |awk ‘{print $3}’ 选取…

为什么在学校很难真正学好嵌入式?

10几年前,我是读电气工程专业,学了很多东西,结构,电机、绘图,plc等等.. 其实,都没什么鸟用,出来还是像个废物。 后面我自学转了单片机开发,说句难听点,自己买个开发板都比在学校学得深。 可能是这个专业的问题,主攻不是嵌入式方向,老师用汇编点个流水灯,这门课就…

CMake学习笔记(三)区分macro与function

目录 共同点--形式类似 macro的形式 function的形式 不同点 1 输入参数的替换阶段不同 macro function 2 输入参数作用域不同 macro function 共同点--形式类似 macro的形式 macro(宏名 输入参数名).... endmacro() function的形式 function(函数名 输入参数名).…

20232831 2023-2024-2 《网络攻防实践》第5次作业

目录 20232831 2023-2024-2 《网络攻防实践》第5次作业1.实验内容&#xff08;1&#xff09;防火墙配置&#xff08;具体IP配置参考自己的IP设置&#xff09;&#xff08;2&#xff09;动手实践&#xff1a;Snort&#xff08;3&#xff09;分析配置规则 2.实验过程3.学习中遇到…

基于小程序实现的校园失物招领系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…

第十二天--二维数组的彻底解刨--地址

1.二维数组我们用父子的地址来称呼二维数组的地址 比如arr[3][4] 这里的arr是二维数组的首地址&#xff0c;也是父数组的首地址&#xff0c;也是子数组的首地址 arr1父数组的地址偏移1&#xff0c;实际上是偏移了4*416个字节 arr[0]是子数组的首地址&#xff0c;arr[0]1是子数…

langchain txt 文档加载,分割

stuff 策略 加载 arXiv 论文&#xff0c;让模型总结前 2000 字 这里采用的是 stuff 策略&#xff0c;也就是将一大段文本。按字数分割成 N 个文本块&#xff0c;又合并成一个大的文本块。 对超大规模不友好&#xff0c;没有区分文档重要性&#xff0c;适合文档量较少场景 i…

安卓刷机fastboot分段传输

win10 fastboot 无法识别&#xff0c;驱动下载地址GitHub - xushuan/google_latest_usb_driver_windows 把inf文件更新到设备管理器驱动更新即可 问题 archive does not contain super_empty.img Sending vbmeta_a (4 KB) OKAY [ 0.117s] Writing …

Springboot项目的测试类书写(速通)

目录 前言1. 单元测试的测试类2. 框架测试的测试类 前言 在实际开发中&#xff0c;如果只是做一个简单的单元测试&#xff08;不涉及端到端、数据库交互、API调用、消息队列处理等&#xff09;&#xff0c;我为了方便一般都是找块儿地方写一个main方法来跑一下就行了&#xff…

Redis中的集群(六)

集群 ASK错误 在进行重新分片期间&#xff0c;源节点向目标节点迁移一个槽的过程中&#xff0c;可能会出现这样一种情况:属于被迁移槽的一部分键值对保存在源节点里面&#xff0c;而另一部分键值对则保存在目标节点里面。当客户端向源节点发送一个与数据库有关的命令&#xf…

C中自定义类型——结构体

一.前言 在C语言中&#xff0c;不仅有int、char、short、long等内置类型&#xff0c;C语言还有一种特殊的类型——自定义类型。该类型可以由使用者自己定义&#xff0c;可以解决一些复杂的个体。 二.结构体 2.1结构体的声明 我们在利用结构体的时候一般是用于描述一些有多种…

javaweb配置JSTL

首先配置好javaweb项目。 在网上下载好jakarta-taglibs-standard并解压。 在web/WEB-INF目录下创建lib目录。 在jakarta-taglibs-standard目录下lib目录内的两个.jar文件复制到javaweb项目lib目录下。 将这两个.jar包导入库。 在idea菜单栏找到“文件”并打开&#xff0c;点…

nvm更新node版本

1、nvm安装和管理多个 Node.js 版本&#xff1a;NVM 允许用户在计算机上同时安装多个不同版本的 Node.js。这使得开发人员可以轻松地在不同的项目中使用不同的 Node.js 版本&#xff0c;而无需手动安装或卸载。 2、nvm切换 Node.js 版本&#xff1a;通过 NVM&#xff0c;用户可…

好菜每回味道不同--建造者模式

1.1 炒菜没放盐 中餐&#xff0c;老板需要每次炒菜&#xff0c;每次炒出来的味道都有可能不同。麦当劳、肯德基这些不过百年的洋快餐却能在有千年饮食文化的中国发展的那么好呢&#xff1f;是因为你不管何时何地在哪里吃味道都一样&#xff0c;而鱼香肉丝在我们中餐却可以吃出上…