python——异常
Python 中的异常及继承关系
在 Python 中,异常用于表示程序在运行过程中遇到的错误,所有异常类最终都继承自 BaseException
。通过异常处理,我们可以捕获和处理这些错误,避免程序崩溃。
Python 异常继承关系图
BaseException+-- SystemExit+-- KeyboardInterrupt+-- GeneratorExit+-- Exception+-- StopIteration+-- StopAsyncIteration+-- ArithmeticError| +-- FloatingPointError| +-- OverflowError| +-- ZeroDivisionError+-- AssertionError+-- AttributeError+-- BufferError+-- EOFError+-- ImportError| +-- ModuleNotFoundError+-- LookupError| +-- IndexError| +-- KeyError+-- MemoryError+-- NameError| +-- UnboundLocalError+-- OSError| +-- BlockingIOError| +-- ChildProcessError| +-- ConnectionError| | +-- BrokenPipeError| | +-- ConnectionAbortedError| | +-- ConnectionRefusedError| | +-- ConnectionResetError| +-- FileExistsError| +-- FileNotFoundError| +-- InterruptedError| +-- IsADirectoryError| +-- NotADirectoryError| +-- PermissionError| +-- ProcessLookupError| +-- TimeoutError+-- ReferenceError+-- RuntimeError| +-- NotImplementedError| +-- RecursionError+-- SyntaxError| +-- IndentationError| +-- TabError+-- SystemError+-- TypeError+-- ValueError| +-- UnicodeError| +-- UnicodeDecodeError| +-- UnicodeEncodeError| +-- UnicodeTranslateError+-- Warning+-- DeprecationWarning+-- PendingDeprecationWarning+-- RuntimeWarning+-- SyntaxWarning+-- UserWarning+-- FutureWarning+-- ImportWarning+-- UnicodeWarning+-- BytesWarning+-- EncodingWarning+-- ResourceWarning
1. BaseException
类
BaseException
是所有异常的基类,所有 Python 异常都从它继承。通常,不建议直接捕获 BaseException
,而应捕获其子类。
1.1 SystemExit
(不建议捕获)
- 说明:当调用
sys.exit()
以退出程序时,抛出此异常。 - 捕获建议:不建议捕获,因为它表示程序要正常退出。
- 示例:
import sys
try:sys.exit()
except SystemExit:print("程序退出")
1.2 KeyboardInterrupt
(不建议捕获)
- 说明:当用户按下
Ctrl+C
终止程序时,会抛出此异常。 - 捕获建议:可以捕获,但通常用于自定义处理程序中断。
- 示例:
try:while True:pass
except KeyboardInterrupt:print("用户中断程序")
1.3 GeneratorExit
(不建议捕获)
- 说明:当生成器关闭时抛出,通常在
yield
生成器对象调用close()
时触发。 - 捕获建议:不建议捕获,通常由系统自动处理。
- 示例:
def my_generator():try:yield 1finally:print("生成器关闭")gen = my_generator()
next(gen)
gen.close()
2. Exception
类(可以捕获)
Exception
是用户代码中常见异常的基类,大部分可捕获的异常都继承自它。
2.1 StopIteration
和 StopAsyncIteration
- 说明:当迭代器或异步迭代器到达结尾时抛出,通常由
for
循环隐式捕获。 - 捕获建议:一般不需要手动捕获。
示例:
my_iter = iter([1, 2, 3])
try:while True:print(next(my_iter))
except StopIteration:print("迭代结束")
2.2 ArithmeticError
及其子类
- 说明:算术运算错误的基类。
- 捕获建议:可以捕获,用于处理算术错误。
ZeroDivisionError
- 说明:除数为零时抛出。
- 示例:
try:result = 1 / 0
except ZeroDivisionError:print("不能除以零")
OverflowError
- 说明:当数值运算结果超出表示范围时抛出。
FloatingPointError
- 说明:浮点运算出错时抛出,较少见。
2.3 AssertionError
- 说明:断言语句失败时抛出。
- 捕获建议:可以通过
try-except
捕获,但应谨慎使用断言。
示例:
try:assert 1 == 2
except AssertionError:print("断言失败")
2.4 AttributeError
- 说明:尝试访问对象不存在的属性时抛出。
示例:
try:obj = Noneobj.some_method()
except AttributeError:print("对象没有这个属性")
2.5 BufferError
- 说明:缓冲区操作失败时抛出。
- 捕获建议:适用于处理低级别内存操作错误。
2.6 EOFError
- 说明:当读取到文件末尾但无法返回任何数据时抛出。
- 捕获建议:适用于文件或输入流操作。
2.7 ImportError
及其子类
- 说明:导入模块失败时抛出。
ModuleNotFoundError
- 说明:模块未找到时抛出。
示例:
try:import non_existent_module
except ImportError:print("模块导入失败")
2.8 LookupError
及其子类
- 说明:查找操作失败时的基类。
IndexError
- 说明:列表、元组或其他序列访问越界时抛出。
KeyError
- 说明:字典中查找不存在的键时抛出。
示例:
my_dict = {"name": "Alice"}
try:print(my_dict["age"])
except KeyError:print("键不存在")
2.9 MemoryError
- 说明:内存不足时抛出。
2.10 NameError
及其子类
- 说明:当尝试访问未定义的变量时抛出。
UnboundLocalError
- 说明:在函数中使用尚未赋值的局部变量时抛出。
示例:
try:print(undefined_var)
except NameError:print("变量未定义")
2.11 OSError
及其子类
- 说明:系统相关的错误,例如文件和网络操作失败。
- 捕获建议:适用于文件系统、网络等 I/O 操作。
常见子类:
FileNotFoundError
:文件未找到。PermissionError
:权限不足。TimeoutError
:操作超时。
示例:
try:with open("non_existent_file.txt", "r") as f:pass
except FileNotFoundError:print("文件未找到")
2.12 ReferenceError
- 说明:弱引用被垃圾回收后访问无效对象时抛出。
2.13 RuntimeError
及其子类
- 说明:运行时错误的基类。
NotImplementedError
- 说明:尚未实现的方法抛出此异常。
2.14 SyntaxError
及其子类
- 说明:Python 语法错误时抛出。
IndentationError
- 说明:缩进错误。
TabError
- 说明:混合使用空格和 Tab 导致的错误。
2.15 TypeError
- 说明:操作或函数应用于不适当类型时抛出。
示例:
try:print(1 + "a")
except TypeError:print("类型错误")
2.16 ValueError
及其子类
- 说明:操作或函数接收到具有正确
类型但不合理的参数时抛出。
UnicodeError
及其子类
- 说明:与 Unicode 编码相关的错误。
3. Warning
类及其子类(可以捕获)
- 说明:
Warning
类表示非致命错误,通常用于提示潜在问题,不会中断程序的执行。尽管它们不会自动抛出,但可以通过warnings
模块生成和捕获警告。 - 捕获建议:可以捕获,通过
warnings.catch_warnings()
实现对警告的捕获。
常见子类:
DeprecationWarning
:提示某个功能即将被废弃。PendingDeprecationWarning
:类似DeprecationWarning
,但仅用于将来废弃的功能。RuntimeWarning
:运行时的一般警告。SyntaxWarning
:语法问题的警告。UserWarning
:用户代码产生的警告。FutureWarning
:将来版本会改变行为的警告。ImportWarning
:导入模块时发生问题的警告。UnicodeWarning
:Unicode 相关问题的警告。BytesWarning
:字节相关问题的警告。EncodingWarning
:编码相关问题的警告。ResourceWarning
:资源管理问题的警告(例如文件没有正确关闭)。
示例:
import warningsdef deprecated_function():warnings.warn("该函数将被废弃", DeprecationWarning)try:warnings.simplefilter("error", DeprecationWarning)deprecated_function()
except DeprecationWarning:print("捕获到废弃警告")
捕获异常总结表格
异常类型 | 是否可以捕获 | 说明 | 示例 |
---|---|---|---|
BaseException | 否 | 所有异常的基类,通常不应直接捕获。 | - |
SystemExit | 否 | 表示程序正常退出,通常不应捕获。 | - |
KeyboardInterrupt | 否 | 用户按 Ctrl+C 终止程序,通常不应捕获。 | - |
GeneratorExit | 否 | 生成器关闭时抛出,不应捕获。 | - |
Exception | 是 | 大部分用户代码中的异常,常见的基类,可以捕获。 | try: ... except Exception: |
StopIteration | 否 | 迭代器结束时抛出,不应捕获。 | - |
StopAsyncIteration | 否 | 异步迭代器结束时抛出,不应捕获。 | - |
ArithmeticError | 是 | 算术运算错误的基类。 | 捕获 ZeroDivisionError , OverflowError , FloatingPointError |
ZeroDivisionError | 是 | 除数为零时抛出。 | try: 1 / 0 except ZeroDivisionError: |
OverflowError | 是 | 数值超出范围时抛出。 | try: math.exp(1000) except OverflowError: |
FloatingPointError | 是 | 浮点运算错误时抛出。 | - |
AssertionError | 是 | 断言失败时抛出。 | try: assert 1 == 2 except AssertionError: |
AttributeError | 是 | 尝试访问不存在的对象属性时抛出。 | try: obj.some_method() except AttributeError: |
BufferError | 是 | 缓冲区操作失败时抛出。 | - |
EOFError | 是 | 读取到文件末尾但无法返回数据时抛出。 | try: input() except EOFError: |
ImportError | 是 | 模块导入失败时抛出。 | try: import non_existent_module except ImportError: |
ModuleNotFoundError | 是 | 模块未找到时抛出。 | try: import non_existent_module except ModuleNotFoundError: |
LookupError | 是 | 查找操作失败的基类。 | 捕获 IndexError , KeyError |
IndexError | 是 | 序列访问越界时抛出。 | try: lst[100] except IndexError: |
KeyError | 是 | 字典查找不存在的键时抛出。 | try: dct["key"] except KeyError: |
MemoryError | 是 | 内存不足时抛出。 | - |
NameError | 是 | 访问未定义的变量时抛出。 | try: print(undefined_var) except NameError: |
UnboundLocalError | 是 | 使用未赋值的局部变量时抛出。 | - |
OSError | 是 | 系统级错误的基类,捕获文件和网络相关的错误。 | 捕获 FileNotFoundError , PermissionError , TimeoutError |
BlockingIOError | 是 | 非阻塞操作没有立即完成时抛出。 | - |
FileNotFoundError | 是 | 文件未找到时抛出。 | try: open("file.txt") except FileNotFoundError: |
PermissionError | 是 | 文件权限不足时抛出。 | try: open("file.txt", "w") except PermissionError: |
TimeoutError | 是 | 操作超时时抛出。 | - |
ReferenceError | 是 | 访问垃圾回收后的弱引用时抛出。 | - |
RuntimeError | 是 | 运行时错误的基类。 | try: raise RuntimeError("错误") except RuntimeError: |
NotImplementedError | 是 | 未实现的方法被调用时抛出。 | - |
RecursionError | 是 | 递归深度超出限制时抛出。 | try: def f(): f() except RecursionError: |
SyntaxError | 否 | 语法错误时抛出,编译时错误。 | - |
IndentationError | 否 | 缩进错误时抛出。 | - |
TabError | 否 | 混合使用 Tab 和空格时抛出。 | - |
SystemError | 否 | Python 解释器内部错误。 | - |
TypeError | 是 | 操作或函数应用于不适当类型时抛出。 | try: 1 + "a" except TypeError: |
ValueError | 是 | 函数接收到具有正确类型但不合理的参数时抛出。 | try: int("abc") except ValueError: |
UnicodeError | 是 | Unicode 编码相关错误的基类。 | 捕获 UnicodeDecodeError , UnicodeEncodeError , UnicodeTranslateError |
Warning | 是 | 可通过 warnings.catch_warnings() 捕获。 | try: warnings.warn("警告", UserWarning) except Warning: |
Python 中的异常处理
在 Python 中,异常处理通过 try
、except
、else
和 finally
四个关键字实现。这种机制让程序能够捕获并处理异常,避免程序崩溃,或在发生异常后执行一些清理操作。
1. try...except
基本结构
最基础的异常处理结构是 try...except
,用来捕获特定类型的异常。
try:# 可能发生异常的代码x = 1 / 0
except ZeroDivisionError: # 捕获指定异常类型print("ZeroDivisionError: Division by zero!")
try
: 包含可能发生异常的代码。except
: 捕获并处理特定的异常。可以捕获多种类型的异常或所有异常。
2. 捕获多个异常
可以在一个 try
语句块中捕获多种异常。
try:x = int("abc")
except (ValueError, TypeError): # 捕获多个异常print("Caught ValueError or TypeError!")
3. 捕获所有异常
使用 except Exception
可以捕获所有继承自 Exception
的异常,但不推荐这样做,因为会忽略具体的错误类型。
try:x = 1 / 0
except Exception as e: # 捕获所有 Exception 类型的异常print(f"Caught an exception: {e}")
4. else
子句
else
子句在没有发生异常时执行,用于确保当 try
语句中的代码成功时执行某些操作。
try:x = 1 / 1
except ZeroDivisionError:print("Division by zero!")
else:print("No exception, division successful!")
5. finally
子句
finally
子句无论是否发生异常都会执行,常用于清理资源,例如关闭文件或数据库连接。
try:f = open("file.txt", "r")
except FileNotFoundError:print("File not found!")
finally:print("This block will always execute")if 'f' in locals():f.close()
6. 自定义异常处理
自定义异常处理结合 raise
语句可以手动抛出异常,也可以捕获并处理这些自定义异常。
class CustomError(Exception):passtry:raise CustomError("Something went wrong")
except CustomError as e:print(f"Caught custom exception: {e}")
7. 处理多个异常的结构
可以同时使用 try...except...else...finally
,让代码更具健壮性。
try:num = int(input("Enter a number: "))result = 10 / num
except ValueError:print("ValueError: Please enter a valid number.")
except ZeroDivisionError:print("ZeroDivisionError: Division by zero.")
else:print(f"Division successful: {result}")
finally:print("Cleaning up resources.")
常见场景总结
- 捕获特定异常: 根据具体的错误类型捕获和处理,以提供准确的错误信息。
- 清理资源: 在
finally
块中关闭文件、释放数据库连接等。 - 输入验证: 使用
try...except
处理用户输入错误。
异常处理的总结表格
异常处理关键字 | 描述 | 使用场景 |
---|---|---|
try | 包含可能抛出异常的代码 | 用于包围可能出错的代码段 |
except | 捕获并处理指定的异常 | 根据不同异常类型处理不同的错误 |
else | 当 try 块没有抛出异常时执行 | 只在没有异常时执行后续代码 |
finally | 无论是否发生异常,都会执行 | 清理资源,如关闭文件或网络连接 |
通过合理使用这些结构,Python 程序能够更健壮地应对错误,并保证在发生异常后进行清理工作。
相关文章:
python——异常
Python 中的异常及继承关系 在 Python 中,异常用于表示程序在运行过程中遇到的错误,所有异常类最终都继承自 BaseException。通过异常处理,我们可以捕获和处理这些错误,避免程序崩溃。 Python 异常继承关系图 BaseException-- …...
【人工智能】利用TensorFlow.js在浏览器中实现一个基本的情感分析系统
使用TensorFlow.js在浏览器中进行情感分析是一个非常实用的应用场景。TensorFlow.js 是一个用于在JavaScript环境中训练和部署机器学习模型的库,使得开发者能够在客户端直接运行复杂的机器学习任务。对于情感分析,我们可以使用预先训练好的模型来识别文本…...
Python——扩展数据类型
Python 的扩展数据类型是对内置数据类型的增强,旨在解决特定需求,提供更高级的功能。我们来看一些常见的扩展数据类型及其原理、用途,并通过示例逐步讲解。 1. collections.namedtuple namedtuple 是增强的元组,允许用名称访问元…...
JavaScript 详解——Vue基础
第一章 JavaScript简介 为什么学习javascript ? JavaScript 是全球最流行的编程语言。 JavaScript 是属于 Web 的编程语言。 JavaScript 是 web 开发者必学的三种语言之一: HTML 定义网页的内容 CSS 规定网页的布局 JavaScript 对网页行为进行编程 …...

机械行业数字化生产供应链产品解决方案(十二)
我们为机械行业提供的数字化生产供应链解决方案通过集成物联网、人工智能和大数据技术,打造了一套智能化的生产和供应链管理系统,实现了从设计、生产到物流的全程数字化、智能化。该系统通过实时数据采集与分析,优化生产计划和资源配置&#…...
Git——命令集合
Git命令集合 1. 基本操作 1.1 创建版本库 初始化本地仓库:git init添加文件到仓库:git add | git add file file2… | git add.提交文件到本地仓库:git commit -m “message” 1.2 版本回退 查看状态: git status查看全部修改…...

python 数据可视化折线图练习(下:代码演示)
根据上篇对三国疫情情况数据的罗列,构建折线图完成数据展示。(示例如下) 接下来是具体代码演示 import json from pyecharts.charts import Line from pyecharts.options import TitleOpts , LegendOpts , ToolboxOpts ,VisualMapOpts , T…...
深入探索 Go 1.18 的 debug/buildinfo:构建信息的获取与应用
标题:深入探索 Go 1.18 的 debug/buildinfo:构建信息的获取与应用 引言 Go 语言自 1.18 版本起,引入了对构建信息的标准化处理,这一特性极大地简化了获取程序构建信息的过程。debug/buildinfo 包提供了访问 Go 二进制文件中嵌入…...

Nios II的BSP Editor
1.菜单打开BSP Editor (1) (2) (3) 项目文件夹 -> software文件夹 -> ... _bsp文件夹 -> settings.bsp文件 2.文件打开BSP Editor 选中项目文件,右键,Nios II -> …...

Android-自适用高度的ViewPager
需求 在项目中,我们常常遇到需要动态调整 ViewPager 的高度,以适应其内容大小的需求。默认情况下,ViewPager 的高度是固定的,无法根据每个页面的内容高度进行调整。这会导致在内容高度不一致时,出现不必要的空白区域或…...
代码随想录day38|| 322零钱兑换 279完全平方数 139单词拆分
322零钱兑换 力扣题目链接 题目描述: 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,…...

Cesium天空盒子(Skybox)制作(js代码)和显示
介绍 在Cesium中,星空背景是通过天空盒子方式(6张图片)来显示的,原生的图片分辨率太低,本项目用于生成天空盒子的6张图片。最终生成的6个图片大小约为500kb(每个),格式为jpg,总共的恒星数目约为…...
JAVA中的缓冲流BufferedInputStream
在Java中,BufferedInputStream 是一种用于包装其他输入流(如 FileInputStream)的过滤流。它通过内部缓冲区机制提高了输入流处理的效率。使用缓冲流可以减少读取数据的次数,因为每次从输入流读取数据时,BufferedInputS…...
WindowContainerTransaction类详解(一)
1、WindowContainerTransaction是什么: windowContainerTransaction类的对象是用来存储对windowContainer的修改的一个集合,windowContainer。因为应用侧是无法直接操作windowContainer的,如果应用侧需要修改windowContainer的话,…...
安装NFS扩展
#添加helm源 helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner #创建个namespace(可选,主要是为了查看资源方便) kubectl create ns nfs-sc-default #使用helm安装(10.1.129.86为NFS地址,/home/data/nfs…...

计算机网络——运输层(进程之间的通信、运输层端口,UDP与TCP、TCP详解)
运输层协议概述 进程之间的通信 运输层向它上面的应用层提供通信服务。 当网络边缘部分的两台主机使用网络核心部分的功能进行端到端的通信时,都要使用协议栈中的运输层;而网络核心部分中的路由器在转发分组时只用到下三层的功能。 Q1:我们…...
代码随想录算法训练营第一天 | 二分查找
文章目录 Leetcode704 二分查找二分法的使用前提:区间选择其他注意事项 Leetcode27 移除元素解题思路:优化思路 Leetcode704 二分查找 链接:https://leetcode.cn/problems/binary-search/ 代码随想录: https://programmercarl.com/ 时间复杂度: O(logN) 空间复杂度:…...
python相关知识
1、注释 共有三种:#、 、””” ””” 2、数据类型 整数、浮点、字符串、布尔、列表、元组、集合、字典 num1 666、num2 3.14、t1 True、t2 False、 列表:list [1,2,3,4] 元组:tuple (11,aaa,ddd,3) 字典:dict {li…...

Visual Studio 2022 LNK2001无法解析的外部符号 _wcscat_s 问题记录
ANSI C程序中,用到了wcsrchr、wcsncpy_s、wcscat_s、wcscpy_s等几个字符串函数,但是编译时提示: 错误 LNK2001 无法解析的外部符号 _wcscat_s 查了挺多帖子,没有解决。 https://bbs.csdn.net/topics/250012844 解决VS编译…...
Java高并发处理机制
高并发处理的思路: 扩容:水平扩容、垂直扩容缓存:将基础的数据放入缓存进行处理使用SpringCloud的注册中心,分服务注册到同一个注册中心,服务器检测使用Spring的熔断操作,检测服务器的心跳那个正常随机跳转…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...

网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...