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

Python异常处理详解:概念、语法与实践

1. 异常的概念

在Python中,异常(Exception)是程序运行时出现的错误或不正常情况。异常通常表示程序在运行时遇到了无法继续执行的条件。Python通过 try/except 语句来捕获和处理异常。

异常可以分为两类:

  • 内建异常:Python提供了一些内建的异常类,表示常见的错误情况,比如 IndexErrorTypeErrorValueError 等。
  • 自定义异常:开发者可以自定义异常类型来表示特定的错误或问题。

2. 常见的内建异常

Python中有很多内建异常类,每种异常类表示不同的错误类型。以下是一些常见的内建异常:

  • SyntaxError:语法错误,表示代码语法不正确。
  • TypeError:类型错误,表示操作或函数应用于错误类型的对象。
  • ValueError:值错误,表示传递给函数的参数的值不合适。
  • IndexError:索引错误,表示访问的索引超出了范围。
  • KeyError:键错误,表示在字典中访问一个不存在的键。
  • AttributeError:属性错误,表示访问对象不存在的属性。
  • ZeroDivisionError:除零错误,表示除法操作中的除数为零。
  • FileNotFoundError:文件未找到错误,表示操作文件时找不到指定的文件。
  • Exception:所有异常的基类,捕获其它未处理的异常时,通常使用 Exception

3. 异常处理的基本语法

Python使用 tryexcept 块来捕获和处理异常:

try:# 可能会引发异常的代码result = 10 / 0
except ZeroDivisionError as e:# 处理异常的代码print(f"错误: {e}")
  • try:用于包裹可能引发异常的代码块。
  • except:用于捕获和处理异常。如果 try 代码块中的某些代码引发了异常,程序会跳转到相应的 except 块执行。
  • as:用于给捕获到的异常实例命名,可以在 except 块中使用该实例进行进一步处理。

4. 多个异常的处理

你可以在同一个 try 块中捕获多种不同类型的异常:

try:x = int(input("请输入一个数字: "))result = 10 / x
except ValueError:print("输入的不是有效的数字")
except ZeroDivisionError:print("不能除以零")
except Exception as e:print(f"发生了其他错误: {e}")
  • try 代码块中,如果出现多个异常,它们会按照 except 块的顺序进行匹配。
  • 如果异常不在匹配的范围内,会触发 Exception 类捕获,Exception可以捕获所有异常,因为所有的异常都是Exception的子类。 

5. elsefinally

Python的异常处理语句还支持 elsefinally 代码块:

  • else:如果 try 代码块没有引发任何异常,else 代码块会被执行。
  • finally:无论是否发生异常,finally 代码块中的内容都会被执行,通常用于清理资源,如关闭文件或数据库连接。
try:result = 10 / 2
except ZeroDivisionError:print("不能除以零")
else:print("计算成功,结果是:", result)
finally:print("清理操作,始终执行")
  • else 语句块中的代码只有在 try 代码块没有引发异常时才会执行。
  • finally 语句块中的代码无论如何都会执行,适合进行资源的释放、日志记录等操作。

6. 抛出异常(raise

除捕获异常,Python还允许你显式地抛出异常。你可以使用 raise 语句来抛出异常,并且可以选择抛出特定类型的异常:了

def check_age(age):if age < 0:raise ValueError("年龄不能为负")return agetry:check_age(-5)
except ValueError as e:print(e)
  • raise 语句用于抛出异常。你可以在抛出异常时传递一个错误消息(如 ValueError("年龄不能为负")),并且可以自定义错误类型。在except语句中可以直接使用raise重新抛出该异常,让上一层函数处理。
    def function(value):try:return int(value)  # 尝试将值转换为整数except ValueError as e:# 如果发生 ValueError 异常,执行此处print(f"function_c: 捕获到 ValueError: {e}")raise  # 重新抛出异常,以便向上传递
  • 你还可以抛出现有的异常类,也可以自定义异常类。

7. 自定义异常

你可以创建自己的异常类,继承自 Exception 类,来表示特定的错误类型。通常情况下,异常类会有一个 __init__ 方法来接收错误信息或其他有用的参数。

class MyCustomError(Exception):"""自定义异常类"""def __init__(self, message, code):super().__init__(message)self.code = codedef my_function(value):if value < 0:raise MyCustomError("值不能为负数!", 1001)try:my_function(-10)
except MyCustomError as e:print(f"捕获到自定义异常:{e}, 错误代码:{e.code}")

8. ExceptionGroup(Python 3.11 及之后)

Python 3.11 引入了 ExceptionGroup,这是一个新的异常类型,允许你将多个异常组合在一起。在处理并发任务或多任务环境时,多个异常可能同时发生,此时可以将这些异常组织到ExceptionGroup 中,便于统一处理。

def f():raise ExceptionGroup("Multiple errors occurred",[ValueError("Invalid value"), KeyError("Missing key")],)try:f()
except ExceptionGroup as e:print(f"捕获到异常组: {e}")

9. 异常的传递

异常的传播遵循以下过程:

  1. 异常抛出:当程序执行过程中发生错误时,Python 会抛出一个异常。例如,试图将一个字符串转换为整数时,Python 会抛出 ValueError
  2. 异常传播:抛出的异常会沿着调用栈(即函数调用的路径)传播,寻找合适的 except 块来捕获它。如果当前函数没有捕获该异常,异常会继续向上传递到调用该函数的地方。
  3. 捕获异常:一旦异常找到合适的 except 块,程序就会跳转到这个 except 块,执行其中的处理代码。异常传递过程会停止,程序还能正常继续运行剩余内容。
  4. 未捕获异常:如果异常没有在任何 except 块中被捕获,它会继续向上传递,直到程序的顶层。如果在顶层没有合适的异常处理代码,程序会终止并显示异常信息。

例子: 

--- 测试用例 1:正常情况 ---
function_b: function_c 返回结果: 123
function_a: function_b 返回结果: 246--- 测试用例 2:function_c 抛出 ValueError,function_b 捕获并处理 ---
function_c: 捕获到 ValueError: invalid literal for int() with base 10: 'abc'
function_b: 捕获到 ValueError: invalid literal for int() with base 10: 'abc',进行特殊处理
function_a: function_b 返回结果: -1--- 测试用例 3:function_c 抛出 ValueError,function_b 没有捕获,function_a 捕获 ---
function_c: 捕获到 ValueError: invalid literal for int() with base 10: 'xyz'
function_a_catch_all: 捕获到其他异常:ValueError invalid literal for int() with base 10: 'xyz'--- 测试用例 4:function_c 抛出 ValueError,所有函数都没有捕获 ---
function_c: 捕获到 ValueError: invalid literal for int() with base 10: 'error'
Traceback (most recent call last):File "g:\python_tutorial-master\progarm\ex.py", line 63, in <module>
Traceback (most recent call last):File "g:\python_tutorial-master\progarm\ex.py", line 63, in <module>File "g:\python_tutorial-master\progarm\ex.py", line 63, in <module>function_a_no_catch("error") # ValueError 没有被捕获,程序终止^^^^^^^^^^^^^^^^^^^^^^^^^^^^function_a_no_catch("error") # ValueError 没有被捕获,程序终止^^^^^^^^^^^^^^^^^^^^^^^^^^^^File "g:\python_tutorial-master\progarm\ex.py", line 60, in function_a_no_catchfinal_result = function_b_no_catch_2(item)^^^^^^^^^^^^^^^^^^^^^^^^^^^File "g:\python_tutorial-master\progarm\ex.py", line 57, in function_b_no_catch_2return function_c(data)^^^^^^^^^^^^^^^^File "g:\python_tutorial-master\progarm\ex.py", line 7, in function_craise e  # 重新抛出异常,让上一层函数处理^^^^^^^File "g:\python_tutorial-master\progarm\ex.py", line 4, in function_creturn int(value)^^^^^^^^^^
ValueError: invalid literal for int() with base 10: 'error'


测试用例1:正常情况

--- 测试用例 1:正常情况 ---
function_b: function_c 返回结果: 123
function_a: function_b 返回结果: 246

function_c 成功将 "123" 转换为整数,结果逐层返回,没有异常发生。

测试用例 2:function_c 抛出 ValueError,function_b 捕获并处理

--- 测试用例 2:function_c 抛出 ValueError,function_b 捕获并处理 ---
function_c: 捕获到 ValueError: invalid literal for int() with base 10: 'abc'
function_b: 捕获到 ValueError: invalid literal for int() with base 10: 'abc',进行特殊处理
function_a: function_b 返回结果: -1

function_c 无法将 "abc" 转换为整数,抛出 ValueErrorfunction_b 捕获了这个异常,进行了特殊处理(返回 -1),异常传播停止。

测试用例 3:function_c 抛出 ValueError,function_b 没有捕获,function_a 捕获

--- 测试用例 3:function_c 抛出 ValueError,function_b 没有捕获,function_a 捕获 ---
function_c: 捕获到 ValueError: invalid literal for int() with base 10: 'xyz'
function_a_catch_all: 捕获到其他异常:ValueError invalid literal for int() with base 10: 'xyz'

function_c 抛出 ValueErrorfunction_b_no_catch 没有捕获,异常继续向上传播到 function_a_catch_all,由于function_a_catch_all 使用了except Exception 捕获了所有类型的异常,所以异常在这里被处理了。

测试用例 4:function_c 抛出 ValueError,所有函数都没有捕获

--- 测试用例 4:function_c 抛出 ValueError,所有函数都没有捕获 ---
function_c: 捕获到 ValueError: invalid literal for int() with base 10: 'error'
Traceback (most recent call last):File "g:\python_tutorial-master\progarm\ex.py", line 63, in <module>
Traceback (most recent call last):File "g:\python_tutorial-master\progarm\ex.py", line 63, in <module>File "g:\python_tutorial-master\progarm\ex.py", line 63, in <module>function_a_no_catch("error") # ValueError 没有被捕获,程序终止^^^^^^^^^^^^^^^^^^^^^^^^^^^^function_a_no_catch("error") # ValueError 没有被捕获,程序终止^^^^^^^^^^^^^^^^^^^^^^^^^^^^File "g:\python_tutorial-master\progarm\ex.py", line 60, in function_a_no_catchfinal_result = function_b_no_catch_2(item)^^^^^^^^^^^^^^^^^^^^^^^^^^^File "g:\python_tutorial-master\progarm\ex.py", line 57, in function_b_no_catch_2return function_c(data)^^^^^^^^^^^^^^^^File "g:\python_tutorial-master\progarm\ex.py", line 7, in function_craise e  # 重新抛出异常,让上一层函数处理^^^^^^^File "g:\python_tutorial-master\progarm\ex.py", line 4, in function_creturn int(value)^^^^^^^^^^
ValueError: invalid literal for int() with base 10: 'error'

function_c 抛出 ValueError,所有函数都没有捕获,异常最终传播到程序顶层,导致程序终止并打印错误信息。

相关文章:

Python异常处理详解:概念、语法与实践

1. 异常的概念 在Python中&#xff0c;异常&#xff08;Exception&#xff09;是程序运行时出现的错误或不正常情况。异常通常表示程序在运行时遇到了无法继续执行的条件。Python通过 try/except 语句来捕获和处理异常。 异常可以分为两类&#xff1a; 内建异常&#xff1a;…...

Kotlin在医疗大健康域的应用实例探究与编程剖析(上)

一、引言 1.1 研究背景与意义 在当今数字化时代,医疗行业正经历着深刻的变革。随着信息技术的飞速发展,尤其是人工智能、大数据、物联网等新兴技术的广泛应用,医疗行业数字化转型已成为必然趋势。这种转型旨在提升医疗服务的效率和质量,优化医疗资源配置,为患者提供更加…...

QT----------QT Data Visualzation

实现思路&#xff1a; 配置项目&#xff1a;在 .pro 文件中添加 QT datavisualization 以引入 QT Data Visualization 模块。创建主窗口&#xff1a;使用 QMainWindow 作为主窗口&#xff0c;添加 Q3DScatter、Q3DBars 和 Q3DSurface 等三维视图组件。初始化和创建三维图表&a…...

什么是Sight Words(信号词)

&#x1f9e1;什么是Sight Words&#xff08;信号词&#xff09; 简单来说&#xff0c;Sight Words就是我们在日常英语中常用的一些基本词汇。可以把它想象成是学练英语的“基础词汇”&#xff0c;这些词在各种考试中经常出现&#xff0c;也是在生活中必不可少的。 &#x1f…...

SpringBoot日志快速集成详解-生产实战

SpringBoot日志快速集成详解 1. 添加依赖2. 创建 logback-spring.xml 配置文件示例 logback-spring.xml 配置&#xff1a; 3. 启用 Spring Boot 自动配置4. 配置 Spring Boot 启动日志级别5. 运行与验证 博文专注于最快速的实战&#xff0c;没有那么多逼逼叨叨的理论&#xff0…...

路由技术在网络中的作用及特点

作用&#xff1a;路径选择&#xff1a;在复杂的网络拓扑结构中&#xff0c;路由技术能够根据网络的当前状态和目标地址&#xff0c;为数据报文选择一条最佳的传输路径&#xff0c;确保数据能够快速、准确地到达目的地。例如&#xff0c;在互联网中&#xff0c;当用户访问一个网…...

【Python系列】Flask 与 FastAPI:两个 Python Web 框架的对比分析

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

云手机:虚拟技术的革命性应用与实体手机的优劣对比

在近年来&#xff0c;随着互联网的火速发展&#xff0c;云手机作为一种新兴的技术产品&#xff0c;在游戏行业特别是手游市场中掀起了一股热潮。云手机&#xff0c;顾名思义&#xff0c;是架设在ARM虚拟服务器上的手机&#xff0c;其独特的虚拟技术为用户带来了前所未有的使用体…...

3. C语言 数据类型

本章目录&#xff1a; 前言&#xff1a;C语言中的数据类型分类1. 基本数据类型1.1 整数类型1.2 浮点类型1.3 字符型常量1.4 字符串常量 2. 枚举类型3. void 类型void类型的使用示例&#xff1a; 4. 类型转换4.1 隐式类型转换4.2 显式类型转换类型转换的注意事项 5. 小结 前言&a…...

npm install 安装选项 -d -s -g

在使用 npm install 时&#xff0c;-d、-g 和 -s 是不同的选项&#xff0c;它们分别代表不同的安装模式或行为。以下是它们的详细解释&#xff1a; 1. -d&#xff1a;--save-dev 含义&#xff1a;将包安装为开发依赖&#xff08;devDependencies&#xff09;。使用场景&#…...

pdf预览兼容问题- chrome浏览器105及一下预览不了

使用的"tato30/vue-pdf": "^1.11.2"预览插件&#xff0c;发现chrome浏览器105及一下预览不了 pdfPreview预览组件&#xff1a; <template><div id"vue_pdf_view"><div class"tool_tip"><template v-if"pa…...

【可实战】需求分析-测试计划↓-测试设计-测试执行-测试总结↓(包含测试计划、测试总结模板,以公司要求为准)

一、完成软件测试工作的必要步骤 需求分析-测试计划-测试设计-测试执行-测试总结 二、测试计划 &#xff08;一&#xff09;测试计划模版 模板在线查看&#xff1a; https://docs.qq.com/doc/DV2hTamxJWnNDaUFF 模板&#xff08;百度网盘&#xff09;&#xff1a; 链接&…...

MySQL 03 章——基本的SELECT语句

一、SQL概述 &#xff08;1&#xff09;SQL背景知识 SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;是使用关系模型的数据库应用语言&#xff0c;与数据直接打交道不同的数据库管理系统生产厂商都支持SQL语句&#xff0c;但都有特有内容 …...

【项目】智能BI洞察引擎 测试报告

目录 一、项目背景BI介绍问题分析项目背景 二、项目功能三、功能测试1、登录测试测试用例测试结果 2、注册测试测试用例测试结果出现的bug 3、上传文件测试测试用例测试结果 4、AI生成图表测试测试用例测试结果 5、分析数据页面测试&#xff08;异步&#xff09;测试用例测试结…...

javaEE-文件操作和IO-文件

目录 一.什么是文件 1.文件就是硬盘(磁盘)上的文件。 2.计算机中存储数据的设备&#xff1a; 3.硬盘的物理特征 4.树型结构组织和⽬录 5.文件路径 文件路径有两种表示方式&#xff1a; 6.文件的分类 二、java中文件系统的操作 1.File类中的属性&#xff1a; 2.构造方…...

2025跨年倒计时

<!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>2025年跨年倒计时</title><style>/* 页…...

下载mysql免安装版和配置

1、下载地址 点击去官网下载https://downloads.mysql.com/archives/community/ 2、解压安装mysql 解压的文件夹是没有my.ini文件和data目录&#xff0c;需要我们自己去创建 根目录下创建my.ini&#xff0c;根目录创建data [mysql] default-character-setutf8[mysqld] #端口 po…...

代码模板-C语言常用的errno的名字、值以及对应关系?转换字符串函数?(errno.h, strerror; errno -l; man errno)

背景 errno.h是C 编程语言标准库中的头文件。它定义了使用符号errno &#xff08;“错误号”的缩写&#xff09;报告和检索错误情况的宏。经常需要用来在内核态用户态返回错误寻找&#xff0c;本文以供快速检索。 常用函数与用法 strerror 根据errno获取文件 比如&#xff…...

全新免押租赁系统助力商品流通高效安全

内容概要 全新免押租赁系统的推出&#xff0c;可以说是一场商品流通领域的小革命。想象一下&#xff0c;不再为押金烦恼&#xff0c;用户只需通过一个简单的信用评估&#xff0c;就能快速租到所需商品&#xff0c;这种体验简直令人惊喜&#xff01;这个系统利用代扣支付技术&a…...

5.微服务灰度发布落地实践(rocketmq增强)

文章目录 前言发送端灰度增强订阅端灰度增强 前言 上一篇分析了&#xff0c;在灰度发布实现中为什么要对消息队列灰度发布进行增强。本篇主要介绍如何实现rocketmq 灰度发布的增强. 发送端灰度增强 订阅端灰度增强...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...