当前位置: 首页 > 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 灰度发布的增强. 发送端灰度增强 订阅端灰度增强...

MySql核心面试面试问题解析

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

logback之自定义pattern使用的转换器

目录 &#xff08;1&#xff09;场景介绍 &#xff08;2&#xff09;定义转换器BizCallerConverter &#xff08;3&#xff09;logback配置conversionRule &#xff08;4&#xff09;测试效果 前文《logback之pattern详解以及源码分析》已经介绍了pattern&#xff0c;以及…...

【MySQL】发展起源与核心架构组件详细介绍

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《MySQL技术精粹》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、MySQL起源背景 2、MySQL发展里程 3、MySQL应用场景 二、MySQL的核心特…...

uni-app 多平台分享实现指南

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

Spring中的IOC是什么,优缺点有哪些?

目录 IOC的核心概念 IOC的优点 IOC的缺点 使用场景说明 总结 IOC&#xff08;控制反转&#xff09;是一种设计思想&#xff0c;用于实现低耦合、高内聚的软件架构。它通过将对象的创建和依赖管理交给外部容器来实现&#xff0c;从而减少对象之间的直接依赖关系。 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字符串传递&#xff1a; JSON.stringify(obj) ②将json字符串转化成JSON对象值&#xff1a;JSON.parse(json) 实际应用&#xff1a; <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 中&#xff0c;CommonJS 是一种模块化规范&#xff0c;它定义了如何在 JavaScript 中创建和使用模块。CommonJS 是 Node.js 使用的默认模块系统。它让开发者能够分离代码&#xff0c;便于重用和维护。 CommonJS 模块的基本特性 模块导出 在 CommonJ…...