当前位置: 首页 > news >正文

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 StopIterationStopAsyncIteration
  • 说明:当迭代器或异步迭代器到达结尾时抛出,通常由 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 和空格时抛出。-
SystemErrorPython 解释器内部错误。-
TypeError操作或函数应用于不适当类型时抛出。try: 1 + "a" except TypeError:
ValueError函数接收到具有正确类型但不合理的参数时抛出。try: int("abc") except ValueError:
UnicodeErrorUnicode 编码相关错误的基类。捕获 UnicodeDecodeError, UnicodeEncodeError, UnicodeTranslateError
Warning可通过 warnings.catch_warnings() 捕获。try: warnings.warn("警告", UserWarning) except Warning:

Python 中的异常处理

在 Python 中,异常处理通过 tryexceptelsefinally 四个关键字实现。这种机制让程序能够捕获并处理异常,避免程序崩溃,或在发生异常后执行一些清理操作。

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捕获并处理指定的异常根据不同异常类型处理不同的错误
elsetry 块没有抛出异常时执行只在没有异常时执行后续代码
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 ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c…...

Cesium天空盒子(Skybox)制作(js代码)和显示

介绍 在Cesium中,星空背景是通过天空盒子方式(6张图片)来显示的,原生的图片分辨率太低,本项目用于生成天空盒子的6张图片。最终生成的6个图片大小约为500kb(每个),格式为jpg,总共的恒星数目约为…...

JAVA中的缓冲流BufferedInputStream

在Java中,BufferedInputStream 是一种用于包装其他输入流(如 FileInputStream)的过滤流。它通过内部缓冲区机制提高了输入流处理的效率。使用缓冲流可以减少读取数据的次数,因为每次从输入流读取数据时,BufferedInputS…...

WindowContainerTransaction类详解(一)

1、WindowContainerTransaction是什么: windowContainerTransaction类的对象是用来存储对windowContainer的修改的一个集合,windowContainer。因为应用侧是无法直接操作windowContainer的,如果应用侧需要修改windowContainer的话&#xff0c…...

安装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的熔断操作,检测服务器的心跳那个正常随机跳转…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...