Python学习笔记16:进阶篇(五)异常处理

异常

在编程中,异常是指程序运行过程中发生的意外事件,这些事件通常中断了正常的指令流程。它们可能是由于错误的输入数据、资源不足、非法操作或其他未预料到的情况引起的。Python中,当遇到这类情况时,会抛出一个异常对象,如果这个异常没有被捕获处理,程序将会终止执行。

异常处理

异常处理是一种编程技术,用于捕捉程序运行过程中发生的异常,并采取适当措施来响应这些异常,而不是让程序直接崩溃。这包括捕获异常、分析异常类型以及根据异常类型决定如何恢复或优雅地结束程序。

Python提供了try、except、else和finally语句来实现异常处理机制:

  1. try: 尝试执行的代码块,可能抛出异常的地方。
  2. except: 捕获并处理特定类型的异常。可以有多个except子句来捕获不同类型的异常。
  3. else: 如果没有异常发生,则执行这里的代码块。
  4. finally: 不管是否发生异常,都会执行的代码块,通常用来清理资源。

处理示例

针对常见的一些异常做处理示例。

处理处 ZeroDivisionError 异常

在学习四则运算的时候,我们都知道除法运行中除数不能为0。
Python中同样也有四则运算,我们练习的时候自然会避免出现除数为0的情况。在实际编程过程中,我们很少会除以一个固定数值,大多数时候都是除以一个变量,而这个变量的值,往往是在程序运行中根据各种情况计算出来的,这个时候,我们就没办法保证除数不能为0了。那么真的遇到除数为0的情况,Python会如何应对呢?

在这里插入图片描述
程序执行出现错误,提示 ZeroDivisionError :division by zero。这个是很明显的提示,并且明确指出在模块第1行。
为了防止程序错误中止,我们可以通过异常处理是程序继续执行。

try:
    result = 10 / 0  # 这里会尝试执行除法运算
except ZeroDivisionError:
    # 捕获到ZeroDivisionError后,输出提示信息
    print("错误:不能除以零")
print("程序继续执行")

在这里插入图片描述

程序打印了错误的提示,然后正确的向下执行。

这就是异常处理的基础语法和使用,但是有时候程序出现异常不出现异常是两种处理方法,这个时候我们就需要用到else语句了。

div = 2
div *= 2
div += 3
div //= 3
div -= 1
try:
    result = 10 / div  # 这里会尝试执行除法运算
except ZeroDivisionError:
    # 捕获到ZeroDivisionError后,输出提示信息
    print("错误:不能除以零")
else:
    print("结果是:", result)
print("程序继续执行")

在这里插入图片描述
根据结果,我们发现程序走了else的分支,那么很明显,异常没有发生,输出结果也符合预期。

最后讲一下比较特殊的finally。这个语句下的分支,是不管异常发生不发生,都能够执行的语句。通常会用来关闭某些资源,比如上篇说的文件的资源,就会在finally代码块中调用close()方法关闭文件资源。

finally语句使用新的异常进行示例。

FileNotFoundError

在进行文件处理的时候,可能不小心填错了地址或者写错了文件格式。这个时候调用文件流的open方法就会出现异常。

file = open("example.txt")
content = file.read()
print(content)

在这里插入图片描述
一个很明显的文件不存在的提示。我们同样使用try…except进行异常处理

try:
    file = open("example.txt")
    content = file.read()
except FileNotFoundError:
    print("文件未找到")
else:
    print(content)

在这里插入图片描述
根据我们学习的文件流知识吗,我们在文件操作过程中,使用了open函数就一定要调用close函数关闭资源。那么流关闭的调用应该放在哪里呢?仔细想想,放在正常流程中,程序出现错误怎么办?放在异常处理中,那正常逻辑不是得也写一份?那么finally无疑是最好的选择了。
写在finally中有两个好处:

确保资源总是被释放:无论try块中的代码是否抛出异常,finally块都会执行。这意味着即使程序因为某些未预料到的错误提前退出,finally中的清理代码也会运行,从而确保打开的资源被正确关闭,防止资源泄露。
逻辑清晰:将资源清理工作放在finally块中,可以使得异常处理逻辑(except块)专注于处理异常本身,而资源管理则由finally统一负责,这样代码结构更加清晰,便于理解和维护。

file = open("example.txt")
try:
    content = file.read()
    print(content)
except FileNotFoundError:
    print("文件未找到")
finally:
    file.close()  # 确保文件被关闭

这样的话,资源最终都会关闭。

多个异常

实际编写代码时,代码通常会几行几十行,那么出现异常的种类也可能不止一种,那么怎么去处理多种异常呢?

try:
    num = int(input("请输入一个数字: "))
    result = 10 / num
except ValueError:
    print("输入的不是有效的数字")
except ZeroDivisionError:
    print("不能除以零")

像这样,按顺序使用except语句处理即可。

那么问题又来了,两个三个,甚至四个五个我都一行行去写没问题,十几个怎么办?异常处理比代码还长,谁看谁头痛。

python有处理所有异常的办法。

try:
    # 可能抛出任何类型的异常的代码
    ...
except Exception as e:
    print(f"发生了异常: {e}")

使用Exception,这表示所有的异常都会被捕获住。

问题又又来了,我就想单独处理FileNotFoundError,其他异常再统一处理,行不行?

当然可以! 请看。

try:
    # 可能抛出多种类型的异常的代码
    file = open("nonexistent_file.txt")  # 示例:尝试打开一个不存在的文件
    content = file.read()
    print(content)
except FileNotFoundError:
    print("错误:指定的文件未找到。")
except Exception as e:
    print(f"发生了其他异常: {e}")  # 捕获除FileNotFoundError之外的所有异常
finally:
    # 关闭文件等清理操作,如果文件已成功打开的话
    if 'file' in locals() and not file.closed:
        file.close()

在python中,except语句存在多个同时使用时,按从上到下的顺序执行。按上面代码来解释就是:python发现你程序执行的时候出现异常,先检查是不是FileNotFoundError,是就在这个except中进行处理,不是的话再往下执行匹配下一个异常类。这样的话别说处理一个,处理十个都没问题。

结尾

python的异常处理就这些内容了,大家在实际使用的时候要灵活运用,根据不同的业务和场景灵活使用try…except…else…finally,来得到自己想要的结果。

作业

  1. 查询常见的一些异常。

  2. 自己编写代码处理这些异常,从单个,到多个,再到单个+所有的模式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/731288.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

34.构建核心注入代码

上一个内容:33.获取入口点 以 33.获取入口点 它的代码为基础进行修改 实现的功能是把LoadLibrary函数注入到目标进程实现加载我们的模块。LoadLibrary只有有程序使用过了它的代码就会加载到内存中(因为动态链接库是内存加载)就是a程序要用L…

QThread 与QObject::moveToThread在UI中的应用

1. QThread的两种用法 第一种用法就是继承QThread,然后覆写 virtual void run(), 这种用法的缺点是不能利用信号槽机制。 第二种用法就是创建一个线程,创建一个对象,再将对象moveToThread, 这种可以充分利用信号槽机制&#xff…

Polyp-DDPM: Diffusion-Based Semantic Polyp Synthesis for Enhanced Segmentation

Polyp- ddpm:基于扩散的语义Polyp合成增强分割 摘要: 本研究介绍了一种基于扩散的方法Polyp-DDPM,该方法用于生成假面条件下息肉的逼真图像,旨在增强胃肠道息肉的分割。我们的方法解决了与医学图像相关的数据限制、高注释成本和隐私问题的挑…

尚硅谷大数据技术ClickHouse教程-笔记01【ClickHouse单机安装、数据类型】

视频地址:一套上手ClickHouse-OLAP分析引擎,囊括Prometheus与Grafana_哔哩哔哩_bilibili 01_尚硅谷大数据技术之ClickHouse入门V1.0 尚硅谷大数据技术ClickHouse教程-笔记01【ClickHouse单机安装、数据类型】尚硅谷大数据技术ClickHouse教程-笔记02【表引…

Comfy UI使用最新SD3模型,并解决报错‘NoneType‘ object has no attribute ‘tokenize‘【实测可行】

解决Comfy UI使用最新SD3模型报错’NoneType’ object has no attribute ‘tokenize’ 前几天SD3发布了,所以想着尝尝鲜,便去下载了SD3来玩一玩。使用的是Comfy UI而不是Stable Diffusion UI,这是一个比SD UI更加灵活的UI界面,使用…

内容安全复习 4 - 深度生成模型

文章目录 概述经典算法自回归模型(Autoregressive model)变分自编码器(VAE)生成对抗网络(GAN)扩散模型(Diffusion model)总结 应用 概述 深度生成模型是一类使用深度学习技术构建的…

L55--- 257.二叉树的所有路径(深搜)---Java版

1.题目描述 2.思路 (1)因为是求二叉树的所有路径 (2)然后是带固定格式的 所以我们要把每个节点的整数数值换成字符串数值 (3)首先先考虑根节点,也就是要满足节点不为空 返回递归的形式dfs(根节…

数字内容“遍地开花”,AI技术如何创新“造梦”?

文 | 智能相对论 作者 | 陈泊丞 这是春晚舞台西安分会场《山河诗长安》的一幕:“李白”现世,带领观众齐颂《将进酒》,将中国人骨子里的豪情与浪漫演绎得淋漓尽致。 这又是浙江义乌商品市场里的另一幕:只会说几个英文单词的女老板…

入门Ansible常用模块

自动化运维Devops-Ansible Ansible是新出现的自动化运维工具,基于Python 开发,集合了众多运维工具(puppet 、cfengine、chef、func、fabric)的优点,实现了批量系统配置 、批量程序部署、批量运行命令 等功能。Ansible…

小程序 如何支付后获取 Unionid

接口说明 接口英文名 getPaidUnionid 功能描述 该接口用于在用户支付完成后,获调用本接口前需要用户完成支付,用户支付完成后,取该用户的 UnionId,无需用户授权。本接口支付后的五分钟内有效。 注意事项 调用前需要用户完成…

直播websocket签名signature字段生成逻辑,一步一步带你研究学习

现在每个直播的链接都要签名字段才可以校验成功,所以需要开始debug逻辑,研究一下这个加密的签名字段哪里来的,先找到这个发送请求的js代码在哪里: 找到发送websocket的地方了,看了一下_getSocketParams这就是获取请求参…

String(C++)

文章目录 前言文档介绍经典题目讲解HJ1 字符串最后一个单词的长度 模拟实现框架构造函数析构函数迭代器c_str()赋值size()capacity()reserveempty()[ ]访问front/backpush_backappendoperatorinsert一个字符insert一个字符串eraseswapfind一个字符find一个字符串substr()clear(…

超级会员卡积分收银系统源码 带完整的安装代码包以及搭建部署教程

系统概述 超级会员卡积分收银系统源码是一款专为商业运营打造的综合性软件解决方案。它集成了会员卡管理、积分管理、收银管理等多种功能,旨在为企业提供高效、便捷、准确的运营管理工具。 该系统源码采用先进的技术架构,具有良好的稳定性和扩展性&…

Python火焰锋动力学和浅水表面波浪偏微分方程

🎯要点 🎯流图可视化正弦余弦矢量场 | 🎯解空间变化边界条件二维拉普拉斯方程 | 🎯解圆柱坐标系标量场 | 🎯解一维泊松方程 | 🎯解二维扩散方程 | 🎯解火焰锋的动力学偏微分方程 | &#x1f3a…

自动备份SQL Server数据库,试试这4种方法!

各种规模的企业都使用 SQL 数据库来存储数据。因此,备份 SQL Server 数据库对于确保数据安全并在发生灾难时可恢复至关重要。对于 SQL 数据库备份,有多种可行的方法,对于特定组织来说,方法将取决于其具体需求。 SQL Server 备份的…

Vue69-路由基本使用

一、需求 二、开发步骤 2-1、路由的安装 vue-router3才能在vue2中使用!现在默认是vue-router4版本,要在vue3中使用!所以,安装的时候要指定版本。 2-2、在main.js中引入和使用路由 2-3、创建router文件夹 一般在vue中用了vue-ro…

vb.net c#一键编绎引用DLL如何做?编绎成独立EXE

.net c#一键编绎引用如何做? 3个工程有依懒关系 ClassLibrary1,ClassLibrary2,MainProject (主工程) ClassLibrary2依赖ClassLibrary1,MainProject依赖前2个 如何实现一键按顺序编绎,自动添加前…

【中学教资科目二】03中学教学

03中学教学 第一节 教学的任务1.1 教学的任务 第二节 教学过程2.1 教学过程的本质2.2 教学过程的基本规律 第三节 教学原则3.1 因材施教原则 第四节 教学方法4.1 我国中学常用的教学方法4.2 国外常用的教学方法 第五节 教学组织形式、教学工作基本环节和教学评价5.1 现代其他教…

SpringSecurity实战入门——认证

项目代码 gson/spring-security-demo 简介 Spring Security 是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架Shiro,它提供了更丰富的功能,社区资源也比Shiro丰富。 一般来说中大型的项目都是使用SpringSecurity来做安全框架。小项目有Shiro的比较多,因为相比…

容器之对齐构件

代码&#xff1a; #include <gtk-2.0/gtk/gtk.h> #include <glib-2.0/glib.h> #include <gtk-2.0/gdk/gdkkeysyms.h> #include <stdio.h>int main(int argc, char *argv[]) {gtk_init(&argc, &argv);GtkWidget *window;window gtk_window_ne…