Python异常处理详解:概念、语法与实践
1. 异常的概念
在Python中,异常(Exception)是程序运行时出现的错误或不正常情况。异常通常表示程序在运行时遇到了无法继续执行的条件。Python通过 try
/except
语句来捕获和处理异常。
异常可以分为两类:
- 内建异常:Python提供了一些内建的异常类,表示常见的错误情况,比如
IndexError
、TypeError
、ValueError
等。 - 自定义异常:开发者可以自定义异常类型来表示特定的错误或问题。
2. 常见的内建异常
Python中有很多内建异常类,每种异常类表示不同的错误类型。以下是一些常见的内建异常:
- SyntaxError:语法错误,表示代码语法不正确。
- TypeError:类型错误,表示操作或函数应用于错误类型的对象。
- ValueError:值错误,表示传递给函数的参数的值不合适。
- IndexError:索引错误,表示访问的索引超出了范围。
- KeyError:键错误,表示在字典中访问一个不存在的键。
- AttributeError:属性错误,表示访问对象不存在的属性。
- ZeroDivisionError:除零错误,表示除法操作中的除数为零。
- FileNotFoundError:文件未找到错误,表示操作文件时找不到指定的文件。
- Exception:所有异常的基类,捕获其它未处理的异常时,通常使用
Exception
。
3. 异常处理的基本语法
Python使用 try
和 except
块来捕获和处理异常:
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. else
和 finally
Python的异常处理语句还支持 else
和 finally
代码块:
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. 异常的传递
异常的传播遵循以下过程:
- 异常抛出:当程序执行过程中发生错误时,Python 会抛出一个异常。例如,试图将一个字符串转换为整数时,Python 会抛出
ValueError
。 - 异常传播:抛出的异常会沿着调用栈(即函数调用的路径)传播,寻找合适的
except
块来捕获它。如果当前函数没有捕获该异常,异常会继续向上传递到调用该函数的地方。 - 捕获异常:一旦异常找到合适的
except
块,程序就会跳转到这个except
块,执行其中的处理代码。异常传递过程会停止,程序还能正常继续运行剩余内容。 - 未捕获异常:如果异常没有在任何
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" 转换为整数,抛出 ValueError
。function_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
抛出 ValueError
,function_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中,异常(Exception)是程序运行时出现的错误或不正常情况。异常通常表示程序在运行时遇到了无法继续执行的条件。Python通过 try/except 语句来捕获和处理异常。 异常可以分为两类: 内建异常:…...

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

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

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

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

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

【Python系列】Flask 与 FastAPI:两个 Python Web 框架的对比分析
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

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

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

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

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

【可实战】需求分析-测试计划↓-测试设计-测试执行-测试总结↓(包含测试计划、测试总结模板,以公司要求为准)
一、完成软件测试工作的必要步骤 需求分析-测试计划-测试设计-测试执行-测试总结 二、测试计划 (一)测试计划模版 模板在线查看: https://docs.qq.com/doc/DV2hTamxJWnNDaUFF 模板(百度网盘): 链接&…...

MySQL 03 章——基本的SELECT语句
一、SQL概述 (1)SQL背景知识 SQL(Structured Query Language,结构化查询语言)是使用关系模型的数据库应用语言,与数据直接打交道不同的数据库管理系统生产厂商都支持SQL语句,但都有特有内容 …...

【项目】智能BI洞察引擎 测试报告
目录 一、项目背景BI介绍问题分析项目背景 二、项目功能三、功能测试1、登录测试测试用例测试结果 2、注册测试测试用例测试结果出现的bug 3、上传文件测试测试用例测试结果 4、AI生成图表测试测试用例测试结果 5、分析数据页面测试(异步)测试用例测试结…...

javaEE-文件操作和IO-文件
目录 一.什么是文件 1.文件就是硬盘(磁盘)上的文件。 2.计算机中存储数据的设备: 3.硬盘的物理特征 4.树型结构组织和⽬录 5.文件路径 文件路径有两种表示方式: 6.文件的分类 二、java中文件系统的操作 1.File类中的属性: 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目录,需要我们自己去创建 根目录下创建my.ini,根目录创建data [mysql] default-character-setutf8[mysqld] #端口 po…...

代码模板-C语言常用的errno的名字、值以及对应关系?转换字符串函数?(errno.h, strerror; errno -l; man errno)
背景 errno.h是C 编程语言标准库中的头文件。它定义了使用符号errno (“错误号”的缩写)报告和检索错误情况的宏。经常需要用来在内核态用户态返回错误寻找,本文以供快速检索。 常用函数与用法 strerror 根据errno获取文件 比如ÿ…...

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

5.微服务灰度发布落地实践(rocketmq增强)
文章目录 前言发送端灰度增强订阅端灰度增强 前言 上一篇分析了,在灰度发布实现中为什么要对消息队列灰度发布进行增强。本篇主要介绍如何实现rocketmq 灰度发布的增强. 发送端灰度增强 订阅端灰度增强...

MySql核心面试面试问题解析
MySql核心面试面试问题解析 有时候往往简单的才是最容易失分的!!! MySQL支持哪些存储引擎?有何区别? 答案:常见的存储引擎有InnoDB、MyISAM、Memory等。InnoDB支持事务,MyISAM不支持事务&#x…...

logback之自定义pattern使用的转换器
目录 (1)场景介绍 (2)定义转换器BizCallerConverter (3)logback配置conversionRule (4)测试效果 前文《logback之pattern详解以及源码分析》已经介绍了pattern,以及…...

【MySQL】发展起源与核心架构组件详细介绍
🐇明明跟你说过:个人主页 🏅个人专栏:《MySQL技术精粹》🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、MySQL起源背景 2、MySQL发展里程 3、MySQL应用场景 二、MySQL的核心特…...

uni-app 多平台分享实现指南
uni-app 多平台分享实现指南 在移动应用开发中,分享功能是一个非常常见的需求,尤其是在社交媒体、营销活动等场景中。使用 uni-app 进行多平台开发时,可以通过一套代码实现跨平台的分享功能,涵盖微信小程序、H5、App 等多个平台。…...

Spring中的IOC是什么,优缺点有哪些?
目录 IOC的核心概念 IOC的优点 IOC的缺点 使用场景说明 总结 IOC(控制反转)是一种设计思想,用于实现低耦合、高内聚的软件架构。它通过将对象的创建和依赖管理交给外部容器来实现,从而减少对象之间的直接依赖关系。 IOC的核…...

Qt实现使用TCP与RS485串口设备通信————附带详细实践方法
文章目录 0 背景1 协议介绍1.1 modbusRTU协议1.1.1 简介1.1.2 RS485和modbusRTU的关系1.1.3 modbusRTU 协议格式1.1.3.1 0x10写多个保持寄存器1.1.3.2 0x02读多个离散输入寄存器1.1.3.3 0x03读多个保持寄存器1.1.3.4 0x04读多个输入寄存器 1.2 ModbusTCP协议1.2.1 ModbusTCP协议…...

js将object整个实体对象作为参数传递
①将object实体转化成json字符串传递: JSON.stringify(obj) ②将json字符串转化成JSON对象值:JSON.parse(json) 实际应用: <div id"div_notice" stylefont-size:14px; width:100%; height:200px; overflow-y:auto;></di…...

超越局部损失函数的预测-优化方法
1 文章信息 文章名为Leaving the Nest : Going Beyond Local Loss Functions for Predict-Then-Optimize。发表在第38届AAAI Conference on Artificial Intelligence. 作者来自哈佛大学。 2 摘要 预测-优化是一种利用机器学习在不确定性下进行决策的方法框架。其核心研究问…...

PDF预览插件
PDF预览插件 可用于当前页面弹窗形式查看,可增加一些自定义功能 pdf预览插件 代码块: pdfobject.js <div class="pdfwrap"><div class="item"><h3>笑场</h3><div class="tags"><p>李诞</p><i&…...

node.js之---CommonJS 模块
CommonJS概念 在 Node.js 中,CommonJS 是一种模块化规范,它定义了如何在 JavaScript 中创建和使用模块。CommonJS 是 Node.js 使用的默认模块系统。它让开发者能够分离代码,便于重用和维护。 CommonJS 模块的基本特性 模块导出 在 CommonJ…...