本篇我们将会学习如何使用 try…except 语句处理程序中的异常。

Python 中存在两种类型的错误:语法错误(syntax error)和异常(exception)。

语法错误

当我们编写了无效的 Python 代码时,程序将会返回语法错误。例如:

current = 1
if current < 10
current += 1

运行以上代码将会返回下面的错误:

File "d:/python/try-except.py", line 2if current < 10^
SyntaxError: invalid syntax

以上示例中,Python 解释器检测到了错误,因为 if 语句后面缺少一个冒号(:)。Python 解释器显示了错误所在的文件名和行号,我们可以基于这些信息找到并修改错误。

异常

即使代码中没有语法错误,它在执行过程中也可以产生错误。Python 将执行过程中的错误称为异常。异常产生的主要原因来自代码执行的环境。例如:

  • 读取了一个不存在的文件。
  • 连接了一个停止运行的远程服务器。
  • 错误的用户输入。

当异常发生时,程序不会自动对其进行处理,而是产生一个错误信息。例如,以下程序用于计算销售增长率:

# 获取净销售额
print('输入净销售额')previous = float(input('- 上一期:'))
current = float(input('- 本期:'))# 计算销售额变化的百分比
change = (current - previous) * 100 / previous# 显示结果
if change > 0:result = f'Sales increase {abs(change)}%'
else:result = f'Sales decrease {abs(change)}%'print(result)

以上代码执过程如下:

  • 首先,提升用户输入两个数字:上一期和本期的净销售额。
  • 然后,计算销售增长率并打印结果。

当我们运行代码并输入“120’”作为本期净销售额时,Python 解释器将会返回以下输出:

输入净销售额
- 上一期:100
- 本期:120'
Traceback (most recent call last):File "d:/python/try-except.py", line 5, in <module>current = float(input('- Current period:'))
ValueError: could not convert string to float: "120'"

Python 解释器显示了包含异常详细信息的错误跟踪(traceback):

  • 引起异常的源文件的路径(d:/python/try-except.py)。
  • 引起异常的代码行(line 5)。
  • 引起异常的语句(current = float(input(’- Current period:’)))。
  • 异常的类型(ValueError)。
  • 错误信息:ValueError: could not convert string to float: “120’”。

由于 float() 函数无法将字符串“120’”转换为数字,Python 解释器产生了一个 ValueError 异常。

Python 提供了不同类型的异常,例如 TypeError、NameError 等。

异常处理

为了使得程序更加健壮,我们需要处理可能的异常。也就是说,我们需要捕获异常并通知用户,以便他们能够修复异常。

处理异常的推荐方式不是直接显示 Python 解释器返回的错误,而是显示一个更加友好的信息。为此,我们可以使用 try…except 语句:

try:# 业务代码
except:# 错误处理

以上语句的执行过程如下:

  • 首先,执行 try 分支中的语句。
  • 如果没有发生异常,执行完 try 分支语句后跳过 except 分支。
  • 如果 try 分支中的任何语句执行出错,停止执行后面的语句并且执行 except 分支中的语句。

以下流程图演示了 try…except 语句的执行过程:

因此,使用 try…except 语句处理异常时,我们需要将可能导致异常的代码放在 try 分支中,将处理异常的代码放在 except 分支中。

下面我们重新上文中的示例,使用 try…except 语句处理异常:

try:# 获取净销售额print('输入净销售额')previous = float(input('- 上一期:'))current = float(input('- 本期:'))# 计算销售额变化的百分比change = (current - previous) * 100 / previous# 显示结果if change > 0:result = f'销售额增加了 {abs(change)}%'else:result = f'销售额减少了 {abs(change)}%'print(result)
except:print('错误!净销售额必须是一个数字。')

If you run the program again and enter the net sales which is not a number, the program will issue the message that you specified in the except block instead:

输入净销售额
- 上一期:100
- 本期:120'
错误!净销售额必须是一个数字。

捕获特定异常

当我们为上一期净销售额输入数字 0 时,将会返回以下信息:

输入净销售额
- 上一期:0
- 本期:100
错误!净销售额必须是一个数字。

在这种情况下,上一期和本期的净销售额都是数字,但是程序仍然返回了一个错误信息。这是因为发生了另一个异常。

try…except 语句可以处理特定的异常。为了捕获指定的异常,我们可以在 except 关键字后面加上异常的类型:

try:# 业务代码
except ValueError as error:# 异常处理

例如:

try:# 获取净销售额print('输入净销售额')previous = float(input('- 上一期:'))current = float(input('- 本期:'))# 计算销售额变化的百分比change = (current - previous) * 100 / previous# 显示结果if change > 0:result = f'销售额增加了 {abs(change)}%'else:result = f'销售额减少了 {abs(change)}%'print(result)
except ValueError:print('错误!净销售额必须是一个数字。')

此时如果我们输入一个字符串作为净销售额,将会返回相同的错误信息。但是,如果我们输入数字 0 作为上一期的净销售额:

输入净销售额
- 上一期:0
- 本期:100

程序将会返回以下错误:

Traceback (most recent call last):File "d:/python/try-except.py", line 9, in <module>change = (current - previous) * 100 / previous
ZeroDivisionError: float division by zero

此时返回的异常类型为 ZeroDivisionError。以下语句导致了除零错误:

change = (current - previous) * 100 / previous

原因就是变量 previous 的值为零。

处理多个异常

try…except 语句可以指定多个 except 分支,用于处理多个异常:

try:# 业务代码
except Exception1 as e1:# 异常处理
except Exception2 as e2:# 异常处理
except Exception3 as e3:# 异常处理

这种方式可以针对不同类型的异常分别进行处理。

如果想要对几种类型的异常进行相同的处理,可以将它们放在一个 except 分支中:

try:# 业务代码
except (Exception1, Exception2):# 异常处理

以下示例使用 try…except 语句对 ValueError 和 ZeroDivisionError 异常分别进行了处理:

try:# 获取净销售额print('输入净销售额')previous = float(input('- 上一期:'))current = float(input('- 本期:'))# 计算销售额变化的百分比change = (current - previous) * 100 / previous# 显示结果if change > 0:result = f'销售额增加了 {abs(change)}%'else:result = f'销售额减少了 {abs(change)}%'print(result)
except ValueError:print('错误!净销售额必须是一个数字。')
except ZeroDivisionError:print('错误!上一期净销售额不能为零。')

当我们输入数字 0 作为上一期的净销售额时:

输入净销售额
- 上一期:0
- 本期:100

将会返回以下错误:

错误!上一期净销售额不能为零。

推荐在异常列表的最后增加一个捕获 Exception 的代码块,用于处理其他通用错误:

try:# 获取净销售额print('输入净销售额')previous = float(input('- 上一期:'))current = float(input('- 本期:'))# 计算销售额变化的百分比change = (current - previous) * 100 / previous# 显示结果if change > 0:result = f'销售额增加了 {abs(change)}%'else:result = f'销售额减少了 {abs(change)}%'print(result)
except ValueError:print('错误!净销售额必须是一个数字。')
except ZeroDivisionError:print('错误!上一期净销售额不能为零。')
except Exception as error:print(error)

总结

  • Python 使用 try…except 语句处理异常。
  • 尽可能地在 except 模块中指定具体的异常。
  • 使用 except Exception 语句捕获其他异常。

【Python入门教程】第52篇 异常处理之try…except相关推荐

  1. python实现登录支付宝收能量_适合零基础人群学习的Python入门教程

    适合零基础人群学习的Python入门教程学什么?小编为大家准备的Python学习教程,课程主要讲解:Python核心编程.Linux基础.前端开发.Web开发.爬虫开发.人工智能等内容. 对于初学者想 ...

  2. python语言入门教程-菜鸟学Python入门教程大盘点|7个多月的心血总结

    原标题:菜鸟学Python入门教程大盘点|7个多月的心血总结 阅读本文大概需要5分钟 菜鸟学python已经写了70几篇,入门的教程已经快写完了,我把入门的文章整理了一下,下面是入门篇的一些总结,也是 ...

  3. python入门教程收藏_python入门教程:超详细保你1小时学会Python,快来收藏看看...

    简介:简介(转发文章+私信[Python]获取资料方式)1.Hello world安装完Python之后,打开IDLE(Python GUI) ,该程序是Python语言解释器,你写的语句能够立即运行 ...

  4. python入门教程(非常详细)-菜鸟学Python入门教程大盘点|7个多月的心血总结

    原标题:菜鸟学Python入门教程大盘点|7个多月的心血总结 阅读本文大概需要5分钟 菜鸟学python已经写了70几篇,入门的教程已经快写完了,我把入门的文章整理了一下,下面是入门篇的一些总结,也是 ...

  5. Python入门教程详解

    Python入门教程 目录 1. 简介 2. 安装 3. 基本语法 4. 数据类型 5. 条件语句 6. 循环 7. 函数 8. 模块 9. 异常处理 10. 文件输入输出 1. 简介 Python是 ...

  6. python快速编程入门黑马-新手如何快速入门Python编程?/开发python入门教程

    Python从入门到实践的教程是什么? 第一阶段Python与Linux数据这是Python的入段,也是帮助零基础学员打好基础的重要阶段,让零基础学员可以具备基础的编程能力,并掌握MySQL进阶内容. ...

  7. Linux Capabilities 入门教程--进阶实战篇

    该系列文章总共分为三篇: Linux Capabilities 入门教程:概念篇 Linux Capabilities 入门教程:基础实战篇 Linux Capabilities 入门教程:进阶实战篇 ...

  8. 《假如编程是魔法之零基础看得懂的Python入门教程 》——(七)我把魔法变成了积木

    学习目标 了解魔法积木的使用--自定义函数 了解魔法积木的结果反馈--自定义函数返回值 了解魔法积木的原料传递--自定义函数传参 了解魔法积木的类型分类--类与对象 推荐 1.<备受好评的看得懂 ...

  9. 《假如编程是魔法之零基础看得懂的Python入门教程 》——(六)精简魔法更强大

    学习目标 了解对相似逻辑的简化编写--循环 推荐 1.<备受好评的看得懂的C语言入门教程> 目录 第一篇:<假如编程是魔法之零基础看得懂的Python入门教程 >--(一)既然 ...

  10. 《假如编程是魔法之零基础看得懂的Python入门教程 》——(五)我的魔法竟然有了一丝逻辑

    学习目标 了解魔法世界中的结构表现--缩进 了解魔法世界的逻辑判断--if 了解魔法世界的多次逻辑判断--ifelse嵌套 了解魔法世界中的逻辑运算--且 and 与或 or 推荐 1.<备受好 ...

最新文章

  1. 使用Iterator迭代器循环集合
  2. node mysql 多个_使用Node.js处理多个MySQL查询
  3. [Leetcode][JAVA] Reorder List
  4. 【ARM】Tiny4412裸板编程之MMU封装
  5. mysql恢复root用户_恢复MYSQL的root用户
  6. Asp.net core中Migration工具使用的交流分享
  7. C语言错误c2063,请教C语言中关于将二维数组复制到一个三维数组的问题
  8. iPhone 15 Pro有望实现屏下面容识别 三星已在研发相关技术
  9. 为什么谷歌、百度都热衷黑客马拉松?
  10. python基础教程pdf-Python基础教程(第3版) PDF高清完整版免费下载|百度云盘
  11. java怎么销毁session_java怎么销毁session?
  12. 感悟较多影响较多的心理效应
  13. 分享全球范围内比较好用的17个免费空间(基本稳定好多年)
  14. 数据库学习2 排序检索数据
  15. 2023年安徽省职业院校技能大赛“网络空间安全” 比赛任务书
  16. 总结2018,规划2019
  17. 数据库日常之修改MySQL数据库密码的方法
  18. 在html中超链接的标记是,在HTML代码中,超链接元素的标记是什么?
  19. C语言中的void*是什么?
  20. office 高效办公智慧树_智慧树知到《OFFICE高效办公》见面课答案

热门文章

  1. 【Minecraft开服】Windows搭建我的世界MC服务器「公网远程联机」
  2. python认证考试题库_python考试复习题库
  3. 最新uniapp 微信小程序获取头像操作指南
  4. 浅析DNS域名解析过程
  5. 一、后端:针对用JAVA POI解决已知路径WORD文件增加自定义页眉,灵活设置页眉字体部分样式@2019
  6. 分布式文件系统FastDFS的搭建
  7. 关键词词云怎么做_用Tagxedo在线制作个性化词云
  8. 华为OD机试 - 分苹果(Java JS Python)
  9. 2021年北京市专精特新中小企业补助申报的条件及办理方法有哪些,补贴20万
  10. MySQL查询不区分大小写问题