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 灰度发布的增强. 发送端灰度增强 订阅端灰度增强...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...
pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...
