Python的错误和异常,异常的处理

我们平时经常会碰到一些报错信息,特别是对于入门的敲代码选手来说,碰到报错嘎嘎头大,但我们要知道它们是程序执行过程中的常态而非例外。本篇文章,就让我们一起来了解一下错误和异常,在平时编程过程中正确理解和有效处理错误与异常,保证程序健壮性。

目录

一、错误和异常的概念

二、异常的处理

1、try-except

2、except ... as e

3、try/except...else子句(可选)

4、try-finally子句(可选)

三、抛出异常

总结:


一、错误和异常的概念

Python错误大致分为两类:错误(Errors)和异常(Exceptions)。错误与异常是编程中用来描述程序运行过程中出现问题的两种不同概念,它们共同构成了程序错误处理的重要组成部分。下面分别介绍错误与异常的概念及其在编程中的角色:

类别描述示例控制能力处理方式结果
错误(Errors)
严重问题与编程语言、操作系统、硬件故障或资源限制相关内存溢出、磁盘空间不足、系统级错误非程序员可控无法通过编程手段(如异常处理)恢复程序终止
异常(Exceptions)
预期外情况程序运行中遇到的非预期但可预见的情况编程逻辑错误(如除数为零)、用户输入错误、外部服务故障、文件不存在、数据库操作失败程序员可控通过编程语言提供的异常处理机制(如Python的try-except程序从异常状态恢复并继续执行

总结:

  • 错误:严重、不可控的系统级问题,导致程序直接终止,我们主要靠预防,养成良好的编程习惯避免错误,以及在设计层面考虑容错和降级方案。
  • 异常:可预见、可处理的程序运行时问题,我们可以通过异常处理机制捕获、处理并恢复,使程序在遇到问题时仍能继续运行。

二、异常的处理

Python的异常处理机制是一种编程策略,它允许程序在遭遇预期或非预期错误时,优雅地捕获、处理这些错误,而不是立即停止执行。这种机制通过特殊的语法结构(如try-except语句)来实现。

1、try-except

  • try部分:包含可能抛出异常的代码块。当这段代码执行时,如果发生异常,程序立即跳转到与之匹配的except子句。
  • except部分:用于捕获并处理try块中抛出的异常。可以指定捕获特定类型的异常,如:
try:# 可能抛出异常的代码
except SpecificExceptionType:# 处理特定类型的异常

也可以捕获多种异常或所有异常(不推荐捕获所有异常):

try:# 可能抛出异常的代码
except (SpecificExceptionType1, SpecificExceptionType2):# 处理多种特定类型的异常
except Exception:# 处理所有异常(对于未知或难以预测的异常,可以使用一个宽泛的except Exception子句作为兜底,# 但应避免过度捕获导致真正问题被掩盖,一般不推荐)

except子句中,可以编写恢复逻辑、提供用户反馈、记录错误日志等。

2、except ... as e

捕获异常的同时,将异常对象赋值给一个变量(如e),以便进一步检查异常的具体信息,如错误消息、错误代码等。以下是一些Python中常见的异常以及处理示例:

#除数为零
try:print(1/0)  # 直接运行会抛出 ZeroDivisionError: division by zero
except ZeroDivisionError as e:print(e) #输出:division by zero#操作或函数应用于不适当的类型
try:"hello" + 5  # 直接运行会抛出 TypeError: can only concatenate str (not "int") to str
except TypeError as e:print(e) #输出:can only concatenate str (not "int") to str#字典中查找不存在的键
try:d = {"name": "Alice"}print(d["age"])  # 直接运行会抛出 KeyError: 'age'
except KeyError as e:print(e) # 输出:'age'#访问序列(如列表、元组)的越界索引
try:l = [1, 2, 3]print(l[3])  # 直接运行会抛出 IndexError: list index out of range
except IndexError as e:print(e) # 输出:list index out of range

3、try/except...else子句(可选)

只有当try块中没有发生任何异常时才会执行。用于放置在成功执行完try块后需要执行的代码,如果使用这个子句,那么必须放在所有的 except 子句之后。

以下实例在 try 语句中判断列表是否可以索引取值,如果用索引取值时正常的没有发生异常则执行 else 部分的语句打印列表元素的平方值。

list1=[1,2,3]
for i in range(3):try:list1[i]except IndexError as e:print(e)else:print(i**2)

使用 else 子句比把所有的语句都放在 try 子句里面要好,这样可以避免一些意想不到,而 except 又无法捕获的异常。

4、try-finally子句(可选)

无论try块中是否发生异常,finally中的代码总会被执行。通常用于资源清理,如关闭文件、释放锁等。

以下实例中 finally 语句无论异常是否发生都会执行:

try:with open('file.txt') as file:read_data = file.read()
except AssertionError as error: #没有捕捉FileNotFoundError异常print(error)
else:try:with open('file.log') as file:read_data = file.read()except FileNotFoundError as fnf_error:print(fnf_error)
finally:print('无论异常是否发生都会执行这句话')

三、抛出异常

使用raise语句可以主动抛出一个异常。这在验证条件不满足、数据无效、业务规则冲突等情况时非常有用。可以抛出预定义的异常,也可以自定义异常类。

抛出预定义异常

Python中使用raise语句来主动抛出一个异常。下面是一些抛出预定义异常的示例:

# 抛出 ValueError,表示传入的年龄值无效
def validate_age(age):if age < 0 or age > 150:raise ValueError(f"Invalid age: {age}. Age must be between 0 and 150.")# 抛出 TypeError,表示函数需要字符串参数
def greet(name):if not isinstance(name, str):raise TypeError(f"Expected a string, got {type(name).__name__} instead.")# 抛出 FileNotFoundError,模拟文件不存在的情况
def read_file(filename):if not os.path.exists(filename):raise FileNotFoundError(f"The file '{filename}' does not exist.")# 抛出 NotImplementedError,表示某个方法尚未实现
class AbstractClass:def abstract_method(self):raise NotImplementedError("The abstract_method must be implemented by subclasses.")

自定义异常

有时,预定义的异常可能不足以准确描述特定业务场景的错误情况。这时,可以创建自定义异常类,通常继承自已有的异常基类(如Exception)。以下是一个自定义异常类的示例:

class InvalidInputError(Exception):"""当用户输入非整数时抛出此异常。"""pass
def add_two_numbers():try:num1 = int(input("输入第一个数字: "))num2 = int(input("输入第二个数字: "))result = num1 + num2print(f"The sum is: {result}")except ValueError:raise InvalidInputError("请只输入整数.")
# 运行程序
add_two_numbers()

在这个例子中,我们创建了一个名为InvalidInputError的自定义异常类,表示用户输入非整数时的错误情况。在add_two_numbers函数中,尝试将用户输入转换为整数。如果输入无法转换(触发ValueError),则使用raise语句抛出InvalidInputError异常,并附带一条提示信息,告诉用户应输入整数。

通过自定义异常InvalidInputError,我们能够清晰地标识并处理用户输入非整数这一特定错误,提高代码的可读性和维护性。

总结:

异常处理要点:

  1. 使用try-except语句:将可能抛出异常的代码放入try块中,对应异常类型的处理逻辑放在except子句中。
  2. 精确捕获:尽量捕获特定类型的异常,避免使用过于宽泛的except Exception,以确保针对性地处理问题。
  3. 提供有用信息:在异常处理中,向用户或日志输出有意义的错误消息,帮助定位问题。
  4. 资源管理:确保在异常发生时,通过finally子句或with语句正确释放资源(如文件、网络连接等)。
  5. 避免空洞的except:除非明确要忽略所有异常,否则不应使用不带任何异常类型的except子句,以免隐藏实际问题。
  6. 测试异常处理:编写单元测试以验证异常处理逻辑是否按预期工作。

应用注意事项:

  • 预防为主:编写健壮的代码,进行有效的输入验证,使用合适的错误检查语句,避免常见的逻辑错误。
  • 主动抛出异常:在验证条件不满足、数据无效、业务规则冲突等情况时,使用raise语句主动抛出异常。
  • 自定义异常:对于特定业务场景,创建自定义异常类以更精确地描述错误状态,提高代码可读性和维护性。
  • 记录日志:在异常处理中记录详细的错误信息,便于后续分析和调试。
  • 用户体验:在向用户报告异常时,提供易于理解的错误消息和可能的解决方案,提升用户体验。

总之,正确理解和熟练运用Python的错误与异常处理机制,是编写稳定、健壮、易维护的Python程序的关键。在日常编程中,应注重预防错误的发生,精准捕获并妥善处理异常,同时确保资源的有效管理与合理的用户体验。

希望上述内容能有效帮助大家理解应用,平时敲代码能高效处理异常。

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

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

相关文章

android adb 实时画面 和操作

1. 下载 scrcpy 建议 windows10 用户 点击链接下载 不然可能会提示缺少部分 dll https://github.com/Genymobile/scrcpy/releases/download/v2.3.1/scrcpy-win32-v2.3.1.ziphttps://github.com/Genymobile/scrcpy/releases/download/v2.3.1/scrcpy-win32-v2.3.1.zip windo…

Android App开发的自动化测试框架UI Automator使用教程

UI Automator为Android程序的UI开发提供了测试环境,这里我们就来看一下Android App开发的自动化测试框架UI Automator使用教程,需要的朋友可以参考下 Android的自动化测试有很多框架&#xff0c;其中ui automator是google官方提供的黑盒UI相关的自动化测试工具&#xff0c;&am…

【进程和线程】操作系统中的并发执行机制

目录 一、什么是进程(Process)&#xff1f; 进程的管理 进程调度(重点) 二、什么是线程(Thread)&#xff1f; 三、进程和线程的区别与联系 进程(Process) 线程(Thread) 总结比较 一、什么是进程(Process)&#xff1f; 进程和线程是操作系统中一个非常核心的话题&#…

[蓝桥杯2012] 罗马数字

罗马数字 题目描述 古罗马帝国开创了辉煌的人类文明&#xff0c;但他们的数字表示法的确有些繁琐&#xff0c;尤其在表示大数的时候&#xff0c;现在看起来简直不能忍受&#xff0c;所以在现代很少使用了。之所以这样&#xff0c;不是因为发明表示法的人的智力的问题&#xf…

【LeetCode】回溯

labuladong回溯 回溯算法秒杀所有排列-组合-子集问题 回溯 一个回溯问题&#xff0c;实际上就是遍历一棵决策树的过程&#xff0c;树的每个叶子节点存放着一个合法答案。你把整棵树遍历一遍&#xff0c;把叶子节点上的答案都收集起来&#xff0c;就能得到所有的合法答案。 站…

CCF-CSP认证考试 202305-3 解压缩 100分题解

更多 CSP 认证考试题目题解可以前往&#xff1a;CSP-CCF 认证考试真题题解 原题链接&#xff1a; 202305-3 解压缩 时间限制&#xff1a; 5.0s 内存限制&#xff1a; 512.0MB 题目背景 西西艾弗岛运营公司是一家负责维护和运营岛上基础设施的大型企业。在公司内&#xff0c;…

SCI论文发表很容易【8】:成为一名学者之路--以经济为方向

【1】Starting Your Career(开启职业生涯) 1. An Old Male Economists Advice to Young Female Economists," Dan Hamermesh, CSWEP Newsletter, Winter 2005. 2."The Young Economists Guide to Professional Etiquette," Daniel S. Hamermesh, Journal of…

上海晋名室外暂存柜助力新技术皮革制品生产行业安全

本周上海晋名又有一台室外危化品暂存柜项目通过验收&#xff0c;此次项目主要用于新技术皮革制品生产行业油桶、化学品等物资的室外暂存安全。 用户单位创立于2004年&#xff0c;是一家从事新技术皮革制品加工、生产的外资企业。 上海晋名作为一家专注工业安全防护领域&#…

python中医学习服务管理系统flask-django-php-nodejs

随着世界经济信息化、全球化的到来和互联网的飞速发展&#xff0c;推动了各行业的改革。若想达到安全&#xff0c;快捷的目的&#xff0c;就需要拥有信息化的组织和管理模式&#xff0c;建立一套合理、动态的、交互友好的、高效的中医学习服务管理系统。当前的信息管理存在工作…

面向对象的三大特性-----封装、继承、多态(Java篇)

&#x1f341; 个人主页&#xff1a;爱编程的Tom&#x1f4ab; 本篇博文收录专栏&#xff1a;Java专栏&#x1f449; 目前其它专栏&#xff1a;c系列小游戏 c语言系列--万物的开始_ &#x1f389; 欢迎 &#x1f44d;点赞✍评论⭐收藏&#x1f496;三连支持一…

ngrok实现内网穿透

在使用jenkins进行自动化部署时&#xff0c;需要设置github的webhook钩子来触发构建&#xff0c;由于jenkins运行在自己的电脑上&#xff0c;因此需要通过内网穿透来接受http请求。 Install ngrok via Homebrew with the following command: brew install ngrok/ngrok/ngrokP…

五、大模型-Prompt

一、prompt是什么 在大型语言模型集成中&#xff0c;"prompt" 是指您向模型提供的输入文本或指令&#xff0c;以引导模型生成特定类型的响应。这个 prompt 可以是一个问题、一段描述、一个任务说明&#xff0c;甚至是一部分对话历史记录等。通过设计和优化 prompt&a…

Linux基础命令[20]-useradd

文章目录 1. useradd 命令说明2. useradd 命令语法3. useradd 命令示例3.1 不加参数3.2 -d&#xff08;指定家目录&#xff09;3.3 -g&#xff08;指定用户组&#xff09;3.4 -G&#xff08;指定附属组&#xff09;3.5 -p&#xff08;加密密码&#xff09;3.6 -e&#xff08;指…

【WEEK4】 【DAY3】整合SSM框架之功能实现—修改、删除数据【中文版】

2024.3.20 Wednesday 接上文【WEEK4】 【DAY2】整合SSM框架之功能实现—总览、添加数据【中文版】 目录 7.6.修改功能7.6.1.修改BookController.java7.6.2.修改allBook.jsp7.6.3.新建updateBook.jsp7.6.4.修改MyBatis-config.xml7.6.5.运行 7.7.删除功能7.7.1.修改BookContro…

【数据库系统】数据库完整性和安全性

第六章 数据库完整性和安全性 基本内容 安全性&#xff1b;完整性&#xff1b;数据库恢复技术&#xff1b;SQL Server的数据恢复机制&#xff1b; 完整性 实体完整性、参照完整性、用户自定义完整性 安全性 身份验证权限控制事务日志&#xff0c;审计数据加密 数据库恢复 冗余…

使用python正则表达式提取RG4

lin_20240204_extract_rg4.py 1.使用正则表达式从utr&#xff0c;cds区域提取rG4&#xff0c;输出结果包括序列名称&#xff0c;序列内容&#xff0c;初始位置&#xff0c;终止位置&#xff0c;序列类型&#xff1b; 2.生成的文件&#xff0c;用于下一步计算g4score:lin_202403…

ABAP 编程中 JASON 字符中 % 百分号如何处理?

在ABAP编程中 JSON 字符串报错&#xff1a; parse error: Unrecognized character escape % (code 37)\n 这个错误提示表明在尝试解析的JSON字符串中有一个不被识别的转义字符 %。在JSON中&#xff0c;只有以下字符可以被转义&#xff1a; \ " / b f n r t u 四位十六进…

关于Windows 10 LTSC 2019无法安装Edge的解决方案

最近新换了Windows 10 LTSC 2019系统&#xff0c;使用体验干净且流畅&#xff0c;但是在更新Edge时遇到了问题&#xff1a;系统内装的是9x版本的Edge浏览器&#xff0c;并且提示更新错误&#xff0c;有system level方面的问题&#xff0c;查询多方后&#xff0c;最终在Microsof…

JavaWeb:AOP、配置优先级、Bean管理、SpringBoot原理、Maven高级

1 AOP 1.1 基本语法 面向切面编程、面向方面编程&#xff0c;面向特定方法编程 在管理bean对象的过程中&#xff0c;主要通过底层的动态代理机制&#xff0c;对特定的方法进行编程 应用&#xff1a;统计每一个业务方法的执行耗时 xml引入依赖 <!-- AOP-->&l…

音视频开发_FFmpeg基石精讲

FFmpeg 框架 核心组件 libavcodec&#xff1a;一个编解码库&#xff0c;包含了众多的编码器和解码器用于编码和解码音视频流。libavformat&#xff1a;一个封装格式库&#xff0c;用于处理各种音视频封装格式。libavutil&#xff1a;一个工具库&#xff0c;提供了常见功能的简…