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.rhkb.cn/news/305007.html

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

相关文章

AGILEFORMER:用于医学图像分割的空间敏捷 Transformer UNET

AGILEFORMER:用于医学图像分割的空间敏捷 Transformer UNET 摘要IntroductionMethodDeformable Patch Embedding2.1.1 Rigid patch embedding2.1.2 Deformable patch embedding Spatially Dynamic Self-AttentionDeformable Multi-head Self-Attention (DMSA)Neighb…

[Mac]安装App后“XX已损坏,无法打开“

问题: “xx.app”已损坏,无法打开。你应该将它移到废纸篓。 解决: 终端输入sudo xattr -r -d com.apple.quarantine 后将Applications中对应的问题app拖入生成路径,然后执行。 $ sudo xattr -r -d com.apple.quarantine /Appli…

StarRocks实战——华米科技埋点分析平台建设

目录 前言 一、原有方案及其痛点 二、引入StarRocks 三、方案改造 3.1 架构设计 3.2 数据流程 3.3 性能指标 3.4 改造收益 前言 华米科技是一家基于云的健康服务提供商,每天都会有海量的埋点数据,以往基于HBase建设的埋点计算分析项目往往效率上…

基于微信小程序的自习室预约系统的设计与实现

个人介绍 hello hello~ ,这里是 code袁~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 🦁作者简介:一名喜欢分享和记录学习的…

OJ 【难度1】【Python】完美字符串 扫雷 A-B数对 赛前准备 【C】精密计时

完美字符串 题目描述 你可能见过下面这一句英文: "The quick brown fox jumps over the lazy dog." 短短的一句话就包含了所有 2626 个英文字母!因此这句话广泛地用于字体效果的展示。更短的还有: "The five boxing wizards…

【学习】软件测试中,我们为什么要进行系统测试

软件测试中的系统测试是一个关键环节,它主要是通过测试整个系统来验证软件是否满足需求规格说明书中的要求。在软件开发周期的后期,系统测试扮演着非常重要的角色,因为它可以发现并纠正软件中存在的错误和缺陷,确保软件的质量和稳…

【数据结构】双向链表 C++

一、什么是双向链表 1、定义 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。 双…

虹科Pico汽车示波器 | 免拆诊断案例 | 2011款东风悦达起亚K5车发动机偶尔起动困难

一、故障现象 一辆2011款东风悦达起亚K5车,搭载G4KD发动机,累计行驶里程约为24.5万km。车主反映,第1次起动发动机时偶尔无法起动着机,第2次能够正常起动着机,但发动机故障灯异常点亮。为此在其他维修厂维修过&#xf…

GDAL源码剖析(九)之GDAL体系架构

GDAL源码剖析(九)之GDAL体系架构_gdal 源码-CSDN博客 在GDAL库中包含栅格数据的读写,矢量数据的读写,以及栅格和矢量数据的相关算法。下面主要对GDAL中栅格数据和矢量数据的体系架构做一个简单的说明。本人英文很烂,有…

vue的 blob文件下载文件时,后端自定义异常,并返回json错误提示信息,前端捕获信息并展示给用户

1.后端返回的json数据结构为: {"message":"下载失败,下载文件不存在,请联系管理员处理!","code":500} 2.vue 请求后台接口返回的 Blob数据 3.问题出现的原因是,正常其他数据列表接口&…

统一处理异常和记录日志

统一处理异常 SpringBoot设计,如果出现错误404或500,自动调用特定路径下的html页面(路径和名字都特定)。/templates/error/404.html、/templates/error/500.html。程序中有错误自动就调用该页面。 但是错误有异步请求错误,也想同时记录日志。…

Windows系统安装WinSCP结合内网穿透实现公网远程SSH本地服务器

List item 文章目录 1. 简介2. 软件下载安装:3. SSH链接服务器4. WinSCP使用公网TCP地址链接本地服务器5. WinSCP使用固定公网TCP地址访问服务器 1. 简介 ​ Winscp是一个支持SSH(Secure SHell)的可视化SCP(Secure Copy)文件传输软件,它的主要功能是在本…

公司电脑如何对文件进行加密?

在现代企业中,文件加密是确保敏感数据安全的关键。使用华企盾DSC数据安全防泄密系统,公司电脑可以轻松地对文件进行加密,以防止未授权的访问和数据泄露。以下是对文件进行加密的步骤和方法: 智能半透明加密:这种模式允…

IntelliJ IDEA(WebStorm、PyCharm、DataGrip等)设置中英文等宽字体,英文为中文的一半(包括标点符号)

1.设置前(idea默认字体为 JetBrains Mono) 2.设置后(楷体)

Vue3 使用ElementUI 显示异常

element提供的样例不能正常显示,需要进行配置 1.npm install element-plus --save 2.main.js // main.ts import { createApp } from vue import ElementPlus from element-plus //全局引入 import element-plus/dist/index.css import App from ./App.vue const …

list的常用接口底层实现与介绍

目录 概念: list的基本结构: list的迭代器⭐❤: 自定义类型的完善: const的迭代器: insert erase: size empty push_back 、push_front 、pop_back、pop_front swap 、operator 析构函数…

【CSS】CSS三大特性、盒子模型

目录 CSS三大特性 1、层叠性 2、继承性 3、优先级 盒子模型 1、网页布局的本质 2、盒子模型(Box Model)组成 3、边框(border) 3.1、边框的使用 3.2、表格的细线边框 3.3、边框会影响盒子实际大小 4、内边距&#xff0…

Unity 九宫格

1. 把图片拖拽进资源文件夹 2.选中图片,然后设置图片 3.设置九宫格 4.使用图片,在界面上创建2个相同的Image,然后使用图片,修改Image Type 为Sliced

前端开发基础(HTML5 + CSS3)【第一篇】:HTML标签之文字排版、图片、链接、音频、视频 涵盖了两个综合案例 做到了基础学得会,实战写的出

点击前往前端开发基础专栏: 文章目录 HTML5 CSS3 开发一、开发环境搭建下载 VS Code1. 2 插件的下载1.3 项目和文件的下载 二、 什么是 HTML2.1 标签的语法2.2 代码演示:2.3 小结 三 、HTML基本骨架3.1 快捷键生成HTML骨架3.2 代码展示3.3 小结 四、标…

第十四讲:C语言字符函数和字符串函数

目录 1. 字符分类函数 2、字符转换函数 3. strlen的使⽤和模拟实现 4. strcpy 的使⽤和模拟实现 5. strcat 的使⽤和模拟实现 6. strcmp 的使⽤和模拟实现 7. strncpy 函数的使⽤ 8. strncat 函数的使⽤ 9. strncmp函数的使⽤ 10. strstr 的使⽤和模拟实现 11. strt…