Python 中都有哪些常见的错误和异常?
本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注!
作者| 慕课网精英讲师 朱广蔚
Python 程序的执行过程中,当发生错误时会引起一个事件,该事件被称为异常。例如:
- 如果程序中有语法错误,会产生 SyntaxError 类型的异常
- 执行除以 0 的运算,会产生 ZeroDivisionError 类型的异常
- 打开一个不存在的文件,会产生 IOError 类型的异常
编程中常见的异常类型总结如下:
| 异常名称 | 描述 |
| ZeroDivisionError | 除(或取模)零 |
| AssertionError | 断言语句失败 |
| AttributeError | 对象没有这个属性 |
| FileNotFoundError | 文件不存在 |
| ModuleNotFoundError | 模块不存在 |
| IndexError | 序列中没有此索引(index) |
| KeyError | 映射中没有这个键 |
| NameError | 未声明/初始化对象 |
| SyntaxError | Python |
| IndentationError | 缩进错误 |
1. ZeroDivisionError 的出现场景
进行除法运算时,要求被除数不能是 0,如果被除数是 0,则会产生异常,示例代码如下:
>>> 100 / 0
Traceback (most recent call last):File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
代码块1234
- 在第 4 行,因为被除数是 0,产生 ZeroDivisionError 类型的异常
2. AssertionError 的出现场景
编写代码时,常常需要在某些特定的位置做出一些假设,假设某些条件为真,Python 使用 assert 语句假设指定条件为真:
assert 布尔表达式
代码块1
如果布尔表达式为真,assert 语句不做任何事情;如果布尔表达式为假,assert 语句抛出 AssertionError 类型的异常。
编写一个程序 AssertionError.py,功能是计算列表前 n 项元素之和:
def calcSum(list, n):assert n <= len(list)sum = 0for i in range(n):sum += list[i]print('sum = %d' % sum)list = [11, 22, 33, 44]
calcSum(list, 3)
calcSum(list, 5)
代码块1234567891011
- 在第 1 行,calcSum 计算列表 list 的前 n 项之和
- 在第 2 行,使用 assert 语句验证参数 n 是否小于等于 list 的长度正常情况下,n 是小于等于 list 的长度如果 n 大于 list 的长度,则表示输入参数 n 有错误
- 在第 9 行,创建一个长度为 4 的列表在第 10 行,传递参数 n 等于 3,是一个合法的参数在第 11 行,传递参数 n 等于 5,是一个非法的参数
程序输出结果如下:
sum = 66
Traceback (most recent call last):File "AssertionError.py", line 11, in <module>calcSum(list, 5)File "AssertionError.py", line 2, in calcSumassert n <= len(list)
AssertionError
代码块1234567
- 在第 1 行,输出 sum = 66calc(sum, 3) 计算列表前 3 项结果为 66
- 在第 7 行,输出 AssertionErrorcalc(sum, 5) 计算列表前 5 项列表只有 4 项元素产生 AssertionError 类型的异常
3. AttributeError 的出现场景
Python 使用 object.property 的形式访问对象的属性,如果没有定义指定名称的属性,则会抛出 AttributeError 类型的异常。
编写程序 AttributeError.py,程序定义了类 Person,Person 包含有两个属性:name 和 age,代码如下:
class Person:def __init__(self, name, age):self.name = nameself.age = agetom = Person('tom', 10)
print(tom.name)
print(tom.age)
print(tom.address)
代码块123456789
- 在第 1 行,定义类 Person,Person 包含有两个属性:name 和 age;
- 在第 6 行,实例化创建一个对象 tom;属性 name 为 ‘tom’;属性 age 为 10;
- 在第 7 行,访问属性 name ;
- 在第 8 行,访问属性 age;
- 在第 9 行,访问属性 address,在类 Person 中没有定义该属性。
程序输出结果如下:
tom
10
Traceback (most recent call last):File "AttributeError.py", line 9, in <module>print(tom.address)
AttributeError: 'Person' object has no attribute 'address'
代码块123456
- 在第 1 行,输出属性 name 的值;
- 在第 2 行,输出属性 age 的值;
- 在第 1 行,属性 address 不存在,产生 AttributeError 类型的异常。
4. FileNotFoundError 的出现场景
python 使用函数 open(path) 打开指定路径的文件,如果文件不存在,则产生 FileNotFoundError 类型的异常,示例如下:
>> open('non-exist-file')
Traceback (most recent call last):File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: 'non-exist-file'
代码块1234
- 在第 4 行,因为文件 non-exist-file 不存在,产生 FileNotFoundError 类型的异常。
5. ModuleNotFoundError 的出现场景
python 使用关键字 import module_name 打开导入名称的模块,如果模块不存在,则产生 ModuleNotFoundError 类型的异常,示例如下:
>>> import non_exist_module
Traceback (most recent call last):File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'non_exist_module'
代码块1234
- 在第 4 行,因为模块 non_exist_file 不存在,产生 ModuleNotFoundError 类型的异常
6. IndexError 的出现场景
在 Python 使用 list[index] 的形式访问列表 list 的指定位置的元素,要求 index:
- 大于等于 0
- 小于列表的长度
如果 index 不在合法范围,则产生 IndexError 类型的异常。
>>> list = ['www', 'imooc', 'com']
>>> list[3]
Traceback (most recent call last):File "<stdin>", line 1, in <module>
IndexError: list index out of range
代码块12345
- 在第 1 行,创建长度为 3 的列表;合法的 index 是 0、1、2;
- 在第 2 行,index 不在合法范围;在第 5 行,产生 IndexError 类型的异常。
7. NameError 的出现场景
Python 在读取变量时,要求变量必须已经定义。如果读取一个尚未定义的变量,会产生 NameError 类型的异常。
>>> variable = 123
>>> print(varible)
Traceback (most recent call last):File "<stdin>", line 1, in <module>
NameError: name 'varible' is not defined
代码块12345
- 在第 1 行,创建变量 variable;
- 在第 2 行,此处将 variable 错误的拼写成 varible;变量 varible 还没有创建;在第 5 行,产生 NameError 类型的异常。
8. SyntaxError 的出现场景
Python 程序中出现语法错误时,会产生 SyntaxError 类型的异常。编写程序 SyntaxError.py:
if 2>1print('2>1 is True')print('2>1 is False')
代码块123
- 在第 1 行,有一处语法错误,在行尾缺少冒号 :
程序输出结果如下:
File "SyntaxError.py", line 1if 2>1^
SyntaxError: invalid syntax
代码块1234
- 在第 1 行,File “SyntaxError.py”, line 1指明错误在文件 SyntaxError.py 中的第 1 行
- 在第 4 行,产生 SyntaxError 类型的异常
9. IndentationError 的出现场景
Python 程序中出现缩进的语法错误时,会产生 IndentationError 类型的异常。编写程序 IndentationError.py:
if 2>1:print('2>1 is True')print('2>1 is False')
代码块123
- 在第 2 行,缩进为 4 个空格
- 在第 3 行,缩进为 2 个空格
程序输出结果如下:
File "IndentationError.py", line 3print('2>1 is False')^
IndentationError: unindent does not match any outer indentation level
代码块1234
- 在第 4 行,输出 IndentationError;源程序第 2 行的缩进为 2 个空格;源程序第 3 行的缩进为 4 个空格;两者不匹配,产生 IndentationError 类型的异常。
11. Python 的标准异常类型总结
在上面的小节中讲解了常见的异常类型,Python 中全部的标准的异常类型如下:
| 异常名称 | 描述 |
| SystemExit | 解释器请求退出 |
| KeyboardInterrupt | 用户中断执行(通常是输入^C) |
| Exception | 常规错误的基类 |
| StopIteration | 迭代器没有更多的值 |
| GeneratorExit | 生成器(generator)发生异常来通知退出 |
| StandardError | 所有的内建标准异常的基类 |
| ArithmeticError | 所有数值计算错误的基类 |
| FloatingPointError | 浮点计算错误 |
| OverflowError | 数值运算超出最大限制 |
| ZeroDivisionError | 除(或取模)零 |
| AssertionError | 断言语句失败 |
| AttributeError | 对象没有这个属性 |
| EOFError | 没有内建输入,到达EOF |
| EnvironmentError | 操作系统错误的基类 |
| IOError | 输入/输出操作失败 |
| OSError | 操作系统错误 |
| WindowsError | 系统调用失败 |
| ImportError | 导入模块/对象失败 |
| LookupError | 无效数据查询的基类 |
| IndexError | 序列中没有此索引(index) |
| KeyError | 映射中没有这个键 |
| MemoryError | 内存溢出错误(对于Python |
| NameError | 未声明/初始化对象 |
| UnboundLocalError | 访问未初始化的本地变量 |
| ReferenceError | 弱引用(Weak |
| RuntimeError | 一般的运行时错误 |
| NotImplementedError | 尚未实现的方法 |
| SyntaxError | Python |
| IndentationError | 缩进错误 |
| TabError | Tab |
| SystemError | 一般的解释器系统错误 |
| TypeError | 对类型无效的操作 |
| ValueError | 传入无效的参数 |
| UnicodeError | Unicode |
| UnicodeDecodeError | Unicode |
| UnicodeEncodeError | Unicode |
| UnicodeTranslateError | Unicode |
| DeprecationWarning | 关于被弃用的特征的警告 |
| FutureWarning | 关于构造将来语义会有改变的警告 |
| OverflowWarning | 旧的关于自动提升为长整型(long)的警告 |
| PendingDeprecationWarning | 关于特性将会被废弃的警告 |
| RuntimeWarning | 可疑的运行时行为(runtime |
| SyntaxWarning | 可疑的语法的警告 |
| UserWarning | 用户代码生成的警告 |
欢迎关注「慕课网」,发现更多IT圈优质内容,分享干货知识,帮助你成为更好的程序员!
相关文章:
Python 中都有哪些常见的错误和异常?
本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注! 作者| 慕课网精英讲师 朱广蔚 Python 程序的执行过程中,当发生错误时会引起一个事件,该事件被称为异常。例如: 如果程…...
51单片机-1
1,单片机内部集成了CPU,RAM,ROM,定时器,中断系统,通讯接口等一系列电脑的常用硬件功能。单片机和计算机相比,单片机是一个袖珍版计算机 2,单片机里有中央处理器(CPU&…...
【Azure 架构师学习笔记】-Azure Data Factory (4)-触发器详解-事件触发器
本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Data Factory】系列。 接上文【Azure 架构师学习笔记】-Azure Data Factory (3)-触发器详解-翻转窗口 前言 事件触发指的是存储事件,所以在新版的ADF 中,已经明确了是“存储事件”,…...
【项目设计】高并发内存池(三)[CentralCache的实现]
🎇C学习历程:入门 博客主页:一起去看日落吗持续分享博主的C学习历程博主的能力有限,出现错误希望大家不吝赐教分享给大家一句我很喜欢的话: 也许你现在做的事情,暂时看不到成果,但不要忘记&…...
2023年,35岁测试工程师只能被“优化裁员”吗?肯定不是····
国内的互联网行业发展较快,所以造成了技术研发类员工工作强度比较大,同时技术的快速更新又需要员工不断的学习新的技术。因此淘汰率也比较高,超过35岁的基层研发类员工,往往因为家庭原因、身体原因,比较难以跟得上工作…...
gitlab部署使用,jenkins部署使用
gitlab部署使用,jenkins部署使用在线安装gitlab下载gitlab安装gitlab使用gitlab设置中文修改管理员密码创建组,创建项目,创建用户jenkins下载jenkins安装jenkin使用jenkins更改管理员密码配置拉取代码配置登录gitlab拉取代码的账号密码配置项目配置gitlab仓库配置构…...
从零开始的机械臂yolov5抓取gazebo仿真(环境搭建篇下)
sunday功能包使用介绍以及开源 sunday我给自己机械臂的命名,原型是innfos的gluon机械臂。通过sw模型文件转urdf。Sunday项目主要由六个功能包sunday_description、sunday_gazebo、sunday_moveit_config、yolov5_ros、vacuum_plugin、realsense_ros_gazebo组成&…...
GCC编译器 MinGW的下载安装使用教程
哎 总所周知 gcc可以用来编译C 和C。在linux广泛应用,那么window怎么使用gcc呢。就要用到gcc的window工具----MInGW,安装好之后,直接可以在windows的dos界面编译。下面讲解安装使用过程。1.官网下载MinGW - Minimalist GNU for Windows downl…...
【项目实战】SpringMVC配置全局属性,是实现WebMvcConfigurer接口,还是直接继承WebMvcConfigurationSupport类?
一、说明 官方推荐以下两种方式来配置全局的SpringMVC的相关属性 方式一:实现WebMvcConfigurer接口(推荐)方式二:直接继承WebMvcConfigurationSupport类。介绍一下两者区别吧。 二、 WebMvcConfigurer介绍 WebMvcConfigurer是一个接口,用于配置全局的SpringMVC的相关属…...
房产营销、地产中介如何高效低成本获客?
数字化对企业而言,机遇和挑战并存。房产企业可借助数字化加强日益扩大的业务规模和业务领域管理,以提升管理效率,降低管理难度;基于数字化技术加强客户的服务体验,进而收集多业态客户和场景数据,拓展创新业…...
Kotlin-作用域函数
在对象的上下文中执行代码块。当您在提供lambda表达式的对象上调用这样的函数时,它会形成一个临时作用域。在此范围内,可以不带名称地访问对象。这样的函数称为作用域函数。 let run with apply also 作用域函数不会引入任何新的技术功能,但它…...
QNX7.1 交叉编译开源库
1.下载QNX7.1 SDK并解压 ITL:~/work/tiqnx710$ ls -l 总用量 16 drwxrwxr-x 4 xxx4096 1月 28 13:38 host -rwxrwxr-x 1 xxx 972 1月 28 13:38 qnxsdp-env.bat -rwxrwxr-x 1 xxx 1676 1月 28 13:38 qnxsdp-env.sh drwxrwxr-x 3 xxx 4096 1月 28 13:38 target xxxITL:~/work/ti…...
论文投稿指南——中文核心期刊推荐(外国语言)
【前言】 🚀 想发论文怎么办?手把手教你论文如何投稿!那么,首先要搞懂投稿目标——论文期刊 🎄 在期刊论文的分布中,存在一种普遍现象:即对于某一特定的学科或专业来说,少数期刊所含…...
Fabric系列 - 链码-内部链码的特性
(1)Fabric repo下的案例 Chaincode(1.4的目录结构) fabric/examples/chaincode/go ├── example02 #一个简单的转账合约 ├── eventsender #发送事件通知 ├── passthru #调用其他链码(或者其他channel的链码)example02 (转账) 一个简单的转账合约。该链码简单实…...
NetApp SnapCenter 备份管理 ——借助应用程序一致的数据备份管理,简化混合云操作
NetApp SnapCenter 简单、可扩展、赋权:跨 Data Fabric 的企业级数据保护和克隆管理 主要优势 • 利用与应用程序集成的工作流和预定义策略简化备份、恢复和克隆管理。 • 借助基于存储的数据管理功能提高性能和可用性,并缩短测试和开发用时。 • 提供基…...
Java内置队列和高性能队列Disruptor
一、队列简介 队列是一种特殊的线性表,遵循先入先出、后入后出(FIFO)的基本原则,一般来说,它只允许在表的前端进行删除操作,而在表的后端进行插入操作,但是java的某些队列运行在任何地方插入删…...
比特数据结构与算法(第四章_下)二叉树的遍历
本章将会详细讲解二叉树遍历的四种方式,分别为前序遍历、中序遍历、后续遍历和层序遍历。在学习遍历之前,会先带大家回顾一下二叉树的基本概念。学习二叉树的基本操作前,需要先创建一颗二叉树,然后才能学习其相关的基本操作&#…...
chatGPT是什么
2022年11月,人工智能公司OpenAI推出了一款聊天机器人:ChatGPT。它能够通过学习和理解人类语言来进行对话,还能与聊天对象进行有逻辑的互动。除了聊天,ChatGPT还能够根据聊天对象提出的要求,进行文字翻译、文案撰写、代…...
jenkins漏洞集合
目录 CVE-2015-8103 反序列化远程代码执行 CVE-2016-0788 Jenkins CI和LTS 远程代码执行漏洞 CVE-2016-0792 低权限用户命令执行 CVE-2016-9299 代码执行 CVE-2017-1000353 Jenkins-CI 远程代码执行 CVE-2018-1000110 用户枚举 CVE-2018-1000861 远程命令执行 CVE-2018…...
用canvas画一个炫酷的粒子动画倒计时
前言 😆 这是一篇踩在活动尾声的文章,主要是之前在摸鱼社群里有人发了个粒子动画的特效视频,想着研究研究写一篇文章出来看看,结果这一下子就研究了半个多月。 😂 下面就把研究成果通过文字的形式展现出来吧…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
篇章二 论坛系统——系统设计
目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...
PydanticAI快速入门示例
参考链接:https://ai.pydantic.dev/#why-use-pydanticai 示例代码 from pydantic_ai import Agent from pydantic_ai.models.openai import OpenAIModel from pydantic_ai.providers.openai import OpenAIProvider# 配置使用阿里云通义千问模型 model OpenAIMode…...
LUA+Reids实现库存秒杀预扣减 记录流水 以及自己的思考
目录 lua脚本 记录流水 记录流水的作用 流水什么时候删除 我们在做库存扣减的时候,显示基于Lua脚本和Redis实现的预扣减 这样可以在秒杀扣减的时候保证操作的原子性和高效性 lua脚本 // ... 已有代码 ...Overridepublic InventoryResponse decrease(Inventor…...
python打卡day49@浙大疏锦行
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 一、通道注意力模块复习 & CBAM实现 import torch import torch.nn as nnclass CBAM(nn.Module):def __init__…...
java+webstock
maven依赖 <dependency><groupId>org.java-websocket</groupId><artifactId>Java-WebSocket</artifactId><version>1.3.5</version></dependency><dependency><groupId>org.apache.tomcat.websocket</groupId&…...
