当前位置: 首页 > 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的熔断操作,检测服务器的心跳那个正常随机跳转…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...