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

【Python语言基础】22、异常处理

文章目录

    • 1. 异常
      • 1.1 简介
      • 1.2 为什么需要异常处理
    • 2. 基本语法
      • 2.1 各部分详解
    • 3. 异常处理流程
      • 3.1 执行try代码块
      • 3.2 异常发生检查
      • 3.3 异常捕获与匹配
      • 3.4 执行匹配的 except 代码块
      • 3.5 执行 else 代码块(可选)
      • 3.6 执行 finally 代码块(可选)
    • 4. 自定义异常对象
    • 5. 异常处理最佳实践

在 Python 里,异常处理是一种很重要的机制,它能帮助你处理程序运行时可能出现的错误,让程序更加健壮、稳定。

1. 异常

1.1 简介

在程序运行时,要是出现了错误,就会引发异常。

比如你尝试打开一个不存在的文件,或者进行除法运算时除数为零,这些情况都会触发相应的异常。

Python 有很多内置的异常类型,像 ZeroDivisionError(除零错误)、FileNotFoundError(文件未找到错误)、TypeError(类型错误)等。

1.2 为什么需要异常处理

异常处理可以让程序在遇到错误时不会直接崩溃,而是按照你预先设定的方式进行处理。

这样能增强程序的稳定性和可靠性,同时也方便你调试和维护代码。

2. 基本语法

Python 使用 try、except、else 和 finally 语句来进行异常处理,
基本结构如下:


try:# 可能会引发异常的代码块result = 10 / 0  # 这里会引发 ZeroDivisionError
except ZeroDivisionError:# 当捕获到 ZeroDivisionError 异常时执行的代码块print("除数不能为零!")
else:# 如果 try 代码块中没有引发异常,则执行此代码块print("没有发生异常,结果是:", result)
finally:# 无论是否发生异常,都会执行此代码块print("这是 finally 代码块,总会被执行。")

2.1 各部分详解

  1. try 块 : 包含可能会引发异常的代码。Python 会尝试执行这个代码块里的语句。

  2. except 块:用于捕获和处理特定类型的异常。你可以指定要捕获的异常类型,当 try 块中引发了指定类型的异常时,就会执行对应的 except 块中的代码。你也可以有多个 except 块来捕获不同类型的异常。

try:num = int("abc")  # 这里会引发 ValueError
except ZeroDivisionError:print("捕获到除零错误!")
except ValueError:print("捕获到值错误,输入不是有效的整数!")
  1. else 块:
    如果 try 块中的代码没有引发任何异常,就会执行 else 块中的代码。它通常用于放置那些只有在没有异常发生时才需要执行的代码。

  2. finally 块:
    无论 try 块中是否发生异常,finally 块中的代码都会被执行。这个代码块常用于释放资源,比如关闭文件、数据库连接等。

3. 异常处理流程

Python 中异常处理的流程遵循一套固定的规则,了解这个流程有助于你更好地运用异常处理机制来编写稳定的代码。

3.1 执行try代码块

程序开始执行 try 代码块中的语句。这部分代码是你认为可能会引发异常的代码区域。例如

try:num1 = 10num2 = 0result = num1 / num2  # 这里会引发 ZeroDivisionError 异常print(result)
except ZeroDivisionError:print("除数不能为零!")

在上述代码中,程序会先执行 try 块里的 num1 / num2 操作。

3.2 异常发生检查

在执行 try 代码块的过程中,Python 会持续检查是否有异常发生。

如果没有异常发生,try 代码块会正常执行完毕,接着会根据情况执行 else 代码块(如果存在),最后执行 finally 代码块(如果存在)。

3.3 异常捕获与匹配

若在 try 代码块执行过程中发生了异常,Python 会立即停止 try 代码块中后续语句的执行,然后开始查找与之匹配的 except 代码块。

它会依次检查每个 except 子句声明的异常类型,看是否与当前发生的异常类型相符。

  • 单一异常捕获
try:num = int("abc")  # 引发 ValueError 异常
except ValueError:print("输入不是有效的整数!")

在这个例子中,当 int(“abc”) 引发 ValueError 异常时,Python 会找到与之匹配的 except ValueError 代码块并执行其中的语句。

  • 多个异常捕获
try:num1 = 10num2 = 0result = num1 / num2  # 引发 ZeroDivisionError 异常
except ValueError:print("输入不是有效的整数!")
except ZeroDivisionError:print("除数不能为零!")

这里,由于发生的是 ZeroDivisionError 异常,Python 会跳过 except ValueError 代码块,执行 except ZeroDivisionError 代码块中的语句。

3.4 执行匹配的 except 代码块

一旦找到匹配的 except 代码块,Python 就会执行该代码块中的语句。

在执行完这个 except 代码块后,程序会跳过其他 except 代码块,继续执行 finally 代码块(如果存在)。

3.5 执行 else 代码块(可选)

如果 try 代码块中没有发生异常,程序会执行 else 代码块(如果存在)。

else 代码块通常用于放置那些只有在没有异常发生时才需要执行的代码。

try:num = 10result = num * 2
except ValueError:print("输入不是有效的整数!")
else:print("计算结果是:", result)

在这个例子中,因为 try 块中没有发生异常,所以会执行 else 代码块并打印计算结果

3.6 执行 finally 代码块(可选)

无论 try 代码块中是否发生异常,也无论异常是否被捕获,finally 代码块中的语句都会被执行。

finally 代码块常用于释放资源,如关闭文件、数据库连接等。

try:file = open("test.txt", "r")content = file.read()print(content)
except FileNotFoundError:print("文件未找到!")
finally:if 'file' in locals():file.close()

在这个例子中,无论是否成功打开文件并读取内容,finally 代码块都会尝试关闭文件,确保资源被正确释放。

综上所述,Python 异常处理的流程就是先执行 try 代码块,检查是否有异常发生,若有则查找匹配的 except 代码块并执行,接着根据情况执行 else 代码块,最后执行 finally 代码块

4. 自定义异常对象

除了使用 Python 内置的异常类型,还可以自定义异常。自定义异常通常是通过继承 Exception 类来实现的。

class MyCustomError(Exception):passtry:raise MyCustomError("这是一个自定义异常!")
except MyCustomError as e:print(e)

在这个例子中,我们定义了一个名为 MyCustomError 的自定义异常类,然后使用 raise 语句手动引发这个异常。

5. 异常处理最佳实践

  • 精确捕获异常:尽量明确指定要捕获的异常类型,避免使用空的 except 语句捕获所有异常,这样能让你更清楚地知道程序中出现了什么问题。
  • 记录异常信息:在捕获异常时,最好记录下异常的详细信息,比如异常类型、异常消息等,方便后续调试。
  • 释放资源:使用 finally 块确保在程序结束时释放资源,避免资源泄漏。

通过合理使用异常处理,可以让 Python 程序更加健壮,能够更好地应对各种意外情况。

相关文章:

【Python语言基础】22、异常处理

文章目录 1. 异常1.1 简介1.2 为什么需要异常处理 2. 基本语法2.1 各部分详解 3. 异常处理流程3.1 执行try代码块3.2 异常发生检查3.3 异常捕获与匹配3.4 执行匹配的 except 代码块3.5 执行 else 代码块(可选)3.6 执行 finally 代码块(可选&a…...

印度zj游戏出海代投本土网盟广告核心优势

印度游戏出海代投本土网盟广告的核心优势包括: 本土化广告策略:针对印度市场的特点,定制本土化的广告策略,吸引更多印度用户的关注和参与。 深度了解印度市场:对印度文化、消费习惯、网络使用习惯等有深入了解&#x…...

NO.97十六届蓝桥杯备战|数论板块-最大公约数和最小公倍数|欧几里得算法|秦九韶算法|小红的gcd(C++)

约数和倍数 如果a 除以b 没有余数,那么a 就是b 的倍数,b 就是a 的约数,记作b ∣ a 。 约数,也称因数。 最⼤公约数和最⼩公倍数 最⼤公约数Greatest Common Divisor,常缩写为gcd。 ⼀组整数的公约数,是…...

《软件设计师》复习笔记(11.6)——系统转换、系统维护、系统评价

目录 一、遗留系统(Legacy System) 定义: 特点: 演化策略(基于价值与技术评估): 高水平 - 低价值: 高水平 - 高价值: 低水平 - 低价值: 低水平 - 高价…...

ROS机器人一般用哪些传感器?

以下是ROS机器人常用传感器的分层详解及思维导图总结,涵盖传感器分类、核心参数、ROS支持及典型应用: 一、环境感知传感器 1. 视觉传感器 类型 原理 ROS支持 数据类型 典型型号/驱动 优缺点及应用场景 单目摄像头 单镜头成像,通过透视变换获取2D图像,依赖算法推断深度 驱…...

嵌入式linux架构理解(宏观理解)6ull学习心得---从架构理解到自写程序运行及自写程序开机自启动

一、linux系统的三个组成部分 U-Boot、Linux kernel 和 rootfs 这三者一起构成了一个完整的 Linux 系 统,一个可以正常使用、功能完善的 Linux 系统。 1.在移植 Linux之前我们需要先移植一个 bootloader 代码,这个 bootloader 代码用于启动 Linux 内核,bootloader有很多,常…...

人像面部关键点检测

此工作为本人近期做人脸情绪识别,CBAM模块前是否能加人脸关键点检测而做的尝试。由于创新点不是在于检测点的标注,而是CBAM的改进,因此,只是借用了现成库Dilb与cv2进行。 首先,下载人脸关键点预测模型:Index of /file…...

面试算法高频08-动态规划-02

动态规划练习题 题目描述 给定两个字符串 text1 和 text2,要求返回这两个字符串的最长公共子序列。例如对于字符串 “ABAZDC” 和 “BACBAD”,需找出它们最长的公共子序列。子序列是指在不改变其余字符相对位置的情况下,从原始字符串中删除…...

PyTorch逻辑回归总结

目录 PyTorch逻辑回归总结神经网络基础基本结构学习路径 线性回归简单线性回归多元线性回归 逻辑回归核心原理损失函数 梯度下降法基本思想关键公式学习率影响 PyTorch实现数据准备模型构建代码优化 核心概念对比 PyTorch逻辑回归总结 神经网络基础 基本结构 输入节点隐藏节…...

使用 Vue 开发登录页面的完整指南

一、项目搭建与基础配置 环境准备 使用 Vue CLI 或 Vite 创建项目,推荐组合:Vue3 Element Plus Vue Router npm create vuelatest npm install element-plus element-plus/icons-vue vue-router 全局配置(main.js) import { c…...

EDID结构

EDID DDC通讯中传输显示设备数据 VGA , DVI 的EDID由128字节组成,hdmi的EDID增加扩展块128字节。扩展快的内容主要是和音频属性相关的,DVI和vga没有音频,hdmi自带音频,扩展快数据规范按照cea-861x标准。 Edid为了让pc或其他的图像…...

文件包含(详解)

文件包含漏洞是一种常见的Web安全漏洞,其核心在于应用程序未对用户控制的文件路径或文件名进行严格过滤,导致攻击者能够包含并执行任意文件(包括本地或远程恶意文件)。 1. 文件包含原理 动态文件包含机制 开发者使用动态包含函数…...

《SpringBoot中@Scheduled和Quartz的区别是什么?分布式定时任务框架选型实战》​

🌟 ​大家好,我是摘星!​ 🌟 今天为大家带来的是Scheduled和Quartz对比分析: 新手常见困惑: 刚学SpringBoot时,我发现用Scheduled写定时任务特别简单。但当我看到同事在项目里用Quartz时&…...

安装fvm可以让电脑同时管理多个版本的flutter、flutter常用命令、vscode连接模拟器

打开 PowerShellfvm安装 dart pub global activate fvm安装完成后,如果显示FVM无法识别,那么需要去添加环境变量path添加这个:C:\Users\Administrator\AppData\Local\Pub\Cache\bin 常用命令 fvm releases 查看用户可以装的flutter版本fvm l…...

UNION和UNION ALL的主要区别

UNION和UNION ALL的主要区别在于处理重复数据和排序的方式。 UNION和UNION ALL都是SQL语言中用于合并两个或多个SELECT语句结果集的关键字。它们的主要区别如下: 1、对重复结果的处理:UNION在进行表链接后会筛选掉重复的记录,而UNION ALL不会…...

Kafka系列之:计算kafka集群topic占的存储大小

Kafka系列之:计算kafka集群topic占的存储大小 topic存储数据格式统计topic存储大小定时统计topic存储大小topic存储数据格式 单位是字节大小 size_bytes{directory="/data/datum/kafka/optics-all" } 782336计算topic存储大小脚本逻辑是: 计算指定目录或文件的大小…...

[密码学实战]Java使用Bouncy Castle实现Base64编码解码:完整指南

Java使用Bouncy Castle实现Base64编码解码:完整指南 摘要 本文将深入讲解如何通过Bouncy Castle(BC)加密库实现Base64编码解码,包含核心API使用、流式处理、与加密算法集成三大实战场景,提供5种代码实现方案和3种性能优化技巧。 一、Base64基础原理 1.1 编码机制 Bas…...

智谱AI大模型免费开放:开启AI创作新时代

文章摘要:近日,国内领先的人工智能公司智谱AI宣布旗下多款大模型服务免费开放,这一举措标志着大模型技术正式迈入普惠阶段。本文将详细介绍智谱AI此次开放的GLM-4 等大模型,涵盖其主要功能、技术特点、使用步骤以及应用场景&#…...

为什么要给单片机植入操作系统

给单片机植入操作系统(通常是实时操作系统,RTOS)主要是为了在资源有限的环境中实现更高效、更可靠的多任务管理和系统调度。以下是主要原因和优势: 1. 多任务并行处理 背景:单片机通常需要同时处理多个任务&#xff0…...

T1结构像+RS-fMRI影像处理过程记录(数据下载+Matlab工具箱+数据处理)

最近需要仿真研究T1结构像RS-fMRI影像融合处理输出目标坐标的路线可行性。就此机会记录下来。 为了完成验证目标处理,首先需要有数据,然后需要准备对应的处理平台和工具箱,进行一系列。那么开始记录~ 前言: 为了基于种子点的功能连…...

【前端基础】--- HTML

个人主页  :  9ilk    专栏  :  前端基础 文章目录 🏠 初识HTML🏠 HTML结构认识HTML标签HTML文件基本结构标签层次结构快速生成代码框架 🏠 HTML常见标签注释标签标题标签 h1-h6段落标签 p换行标签 br格式化标签图片标签 img超链接标签…...

黑马V11版 最新Java高级软件工程师课程-JavaEE精英进阶课

课程大小:60.2G 课程下载:https://download.csdn.net/download/m0_66047725/90615581 更多资源下载:关注我 阶段一 中台战略与组件化开发专题课程 阶段二 【物流行业】品达物流TMS 阶段三 智牛股 阶段四 千亿级电商秒杀解决方案专题 …...

C#插件与可扩展性

外接程序为主机应用程序提供了扩展功能或服务。.net framework提供了一个编程模型,开发人员可以使用该模型来开发加载项并在其主机应用程序中激活它们。该模型通过在主机和外接程序之间构建通信管道来实现此目的。该模型是使用: System.AddIn, System.AddIn.Hosting, System.…...

CVPR‘25 | 高文字渲染精度的商品图文海报生成

本文分享阿里妈妈智能创作与AI应用团队在图文广告创意方向上提出的商品图文海报生成模型,通过构建字符级视觉表征作为控制信号,可以实现精准的图上中文逐像素生成。基于该项工作总结的论文已被 CVPR 2025录用,并在阿里妈妈业务场景落地&#…...

Golang|抽奖相关

文章目录 抽奖核心算法生成抽奖大转盘抽奖接口实现 抽奖核心算法 我们可以根据 单商品库存量/总商品库存量 得到每个商品被抽中的概率,可以想象这样一条 0-1 的数轴,数轴上的每一段相当于一种商品,概率之和为1。 抽奖时,我们会生…...

RT-Thread开发文档合集

瑞萨VisionBoard开发实践指南 RT-Thread 文档中心 RT-Thread-【RA8D1-Vision Board】 RA8D1 Vision Board上的USB实践RT-Thread问答社区 - RT-Thread 【开发板】环境篇:05烧录工具介绍_哔哩哔哩_bilibili 【RA8D1-Vision Board】基于OpenMV 实现图像分类_哔哩哔哩_…...

rulego-server是一个开源程序,是一个轻量级、无依赖性的工作流自动化平台。支持 iPaaS、流式计算和 AI 能力。

一、软件介绍 文末提供程序和源码下载学习 RuleGo-Server 是一个基于 RuleGo 构建的轻量级、高性能、模块化和集成友好的自动化工作流程平台。可用于自动化编排、iPaaS(集成平台即服务)、API 编排、应用编排、AI 编排、数据处理、IoT 规则引擎、AI 助手…...

鸿蒙系统开发状态更新字段区别对比

在鸿蒙系统开发中,状态管理是构建响应式UI的核心机制,主要通过装饰器(Decorators)实现字段的状态观测与更新。根据鸿蒙的版本(V1稳定版和V2试用版),支持的装饰器及其特性有所不同。以下是主要状…...

抽象的https原理简介

前言 小明和小美是一对好朋友,他们分隔两地,平时经常写信沟通,但是偶然被小明发现他回给小美的信好像被人拆开看过,甚至偷偷被篡改过。 对称加密算法 开头的通信过程比较像HTTP服务器与客户端的通信过程,全明文传输…...

HTML理论题

1.什么是HTML? 超文本标记语言(英语:HyperText Markup Language,简称:HTML)是一种用于创建网页的标准标记语言。 2.DOCTYPE 的作用是什么?标准与兼容模式(混杂模式)各有什么区别? DOCTYPE 的作用是告知浏览器的解析器用什么文档标准解析这个文档。 标准模式:用于…...