Python基础教学之五:异常处理与文件操作——让程序更健壮

Python基础教学之五:异常处理与文件操作——让程序更健壮

一、异常处理概念

1. 理解异常

  • 异常是程序运行中发生的错误或意外情况,比如除以零、访问不存在的列表元素等。
  • 如果不进行处理,异常会导致程序终止运行。
  • 在编程过程中,我们经常会遇到意料之外的情况,这些情况如果不加以处理,可能会导致程序崩溃或者产生不可预料的结果。异常处理是一种防御性编程策略,使得程序在遇到错误时能够优雅地恢复或报告错误而非直接崩溃。
  • 了解不同种类的异常及其应用场景是通过Python编程进行有效错误处理的关键。

        下面是简单的例子,它打开一个文件,在该文件中的内容写入内容,但文件没有写入权限,发生了异常:

#!/usr/bin/python
# -*- coding: UTF-8 -*-try:fh = open("testfile", "w")fh.write("这是一个测试文件,用于测试异常!!")
except IOError:print "Error: 没有找到文件或读取文件失败"
else:print "内容写入文件成功"fh.close()

2. 异常类型

  • Python有多种内置异常类型,如IndexErrorTypeErrorValueError等,每种异常对应特定的错误情况。
  • 可以通过创建自定义类来定义新的异常类型。

3. 异常的层次结构

  • 所有的异常都是从基类Exception派生出来的。
  • 异常的层次结构可以帮助我们更好地组织和处理不同类型的异常。

二、异常处理机制

1. try-except语句

  • try块包含可能引发异常的代码。
  • except块捕获并处理特定类型的异常。
  • 当Python解释器执行try块中的代码时,如果没有任何异常发生,那么except块将被跳过,程序将继续执行try块之后的代码。但是,如果try块中的代码引发了异常,那么try块中剩余的部分将被跳过,程序将查找下一个适当的except块来处理这个异常。
  • except块可以针对特定的异常类型进行处理,也可以使用一个except块来捕获并处理所有类型的异常。在except块中可以使用一个变量来接收异常实例,这给了我们更多的信息来了解异常的具体原因。

2. 多个except子句

  • 可以在一个try块后使用多个except子句来处理不同类型的异常。
  • 每个except子句指定一种异常类型和一个处理动作。
  • 在复杂的程序中,可能会遇到多种不同的错误情况,每种情况可能需要不同的处理方式。通过使用多个except子句,我们可以为每种异常类型提供定制化的处理代码。
try:# 尝试执行一些操作num = int(input("Enter a number: "))result = 10 / numprint(result)except ValueError:# 处理ValueError异常,如非数字字符串转换为数字时引发的错误print("Please enter a valid number.")except ZeroDivisionError:# 处理ZeroDivisionError异常,如除数为零时引发的错误print("Division by zero is not allowed.")except Exception as e:# 通用异常处理,捕获除上述以外的所有异常print("An unexpected error occurred:", str(e))

3. finally子句

  • finally子句的代码无论是否发生异常都会执行,常用于释放资源,如关闭文件。
  • 在Python的异常处理机制中,finally子句是一个可选的部分,它出现在try/except块之后。
  • 不管前面的代码是否发生了异常,finally子句中的代码都将被执行。这使其成为执行重要清理工作的理想选择,例如关闭文件、网络连接等资源,无论其前的代码是否成功。

三、文件操作与异常处理

1. 文件打开与关闭

  • 使用open()函数打开文件,并通过close()方法关闭文件。
  • 忘记关闭文件可能导致数据丢失或损坏。
  • 在处理文件时,我们经常需要读取或写入数据。在Python中,我们使用open()函数来打开一个文件,并获取一个文件对象,然后可以使用这个对象进行读写操作。
  • 然而,文件操作可能会引发如FileNotFoundError(当文件不存在时)、IsADirectoryError(当尝试打开一个目录而不是文件时)等多种异常。
  • 确保文件在使用后正确关闭是很重要的,因为打开的文件会占用系统资源,而且在一些操作系统中,未关闭的文件可能会阻止其他程序访问该文件。

2. 异常处理在文件操作中的应用

  • 使用try-except-finally结构确保文件正确关闭,即使在读写过程中发生异常。
  • 可以捕获并处理IOError等与文件操作相关的异常。
try:# 打开文件file = open("example.txt", "r")# 读取文件内容content = file.read()print(content)except IOError as e:# 捕获并处理IOError异常print("An I/O error occurred:", str(e))finally:# 确保文件被关闭,无论是否发生异常if 'file' in locals():file.close()print("File closed successfully.")

        在这个例子中,我们首先尝试打开一个名为"example.txt"的文件,并读取其内容。如果在打开或读取文件的过程中发生了I/O错误(例如文件不存在或没有读取权限),则会触发IOError异常。在except块中,我们捕获了这个异常并打印了一个错误消息。

        无论是否发生异常,finally块中的代码都会被执行。在这里,我们检查变量file是否存在于局部作用域中,如果存在,则调用file.close()方法来关闭文件。这样可以确保即使发生异常,文件也会被正确关闭。

3.上下文管理器

  • 通过实现with语句和上下文管理器,可以自动管理资源,如文件的打开和关闭。
  • with语句简化了资源管理,使代码更加清晰和健壮。
  • 上下文管理器是Python的一个强大特性,它允许定义一个上下文,在这个上下文中可以包含一些始终需要在程序中执行的设置和清理代码。
  • 当进入with代码块时,上下文管理器会执行一些设置工作,而当离开这个代码块时,无论因为正常结束还是由于引发了异常,它都会执行清理工作。
  • 对于文件操作来说,使用上下文管理器意味着我们不需要再显式调用file.close()来关闭文件。即使文件操作中抛出了异常,上下文管理器也会保证文件得到正确的关闭。
  • 官网操作文档:contextvars --- 上下文变量 — Python 3.12.4 文档

四、总结

        在Python编程中,异常处理和文件操作是两个关键的概念,它们对于创建健壮和可靠的程序至关重要。将异常处理与文件操作相结合,不仅可以提升程序的稳健性,还能提高代码的可读性和可维护性。通过掌握这些技能,开发者可以更自信地处理文件数据,同时确保程序即使在面对错误时也能优雅地运行。学习并应用这些概念,无疑会让我们的Python编程之旅更加顺利和高效。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【YOLOv8】 用YOLOv8实现数字式工业仪表智能读数(二)

上一篇圆形表盘指针式仪表的项目受到很多人的关注,咱们一鼓作气,把数字式工业仪表的智能读数也研究一下。本篇主要讲如何用YOLOV8实现数字式工业仪表的自动读数,并将读数结果进行输出,若需要完整数据集和源代码可以私信。 目录 &…

初识Laravel(Laravel的项目搭建)

初识Laravel(Laravel的项目搭建) 一、项目简单搭建(laravel)1.首先我们确保使用国内的 Composer 加速镜像([加速原理](https://learnku.com/php/wikis/30594)):2.新建一个名为 Laravel 的项目&a…

简过网:“三支一扶”这些政策你知道吗?

你好小编,我最近打算备考三支一扶,能介绍一些关于三支一扶的相关知识吗? 为了让大家更好的了解三支一扶,下面这篇文章,小编以问答的方式给大家介绍,希望能够帮助到你! 1、什么是三支一扶&#…

电脑 DNS 缓存是什么?如何清除?

DNS(Domain Name System,域名系统)是互联网的重要组成部分,负责将人类易记的域名转换为机器可读的 IP 地址,从而实现网络通信。DNS 缓存是 DNS 系统中的一个关键机制,通过临时存储已解析的域名信息&#xf…

消息队列必知必会-RabbitMQ

文章目录 RabbitMQ是什么?有什么特点?RabbitMQ架构RabbitMQ消息消费过程如何保证消息不丢失?可靠性传输?生产者丢失了数据RabbitMQ(broker)丢失了数据消费端丢失数据 顺序消息错乱场景解决方案 高可用普通集…

git提交大文件服务500

错误如图 需保证git服务端能接收大文件 修改项目下.git文件中的config文件,加入 [http] postBuffer 524288000

力扣 160相聚链表

注意 判断是否有交点 用while(A! B) 其中A A nullptr? headb:A->next;B同理 注意,while循环的退出条件是AB指针指向同一个,如果没有相交,仍然可以退出 当AB都为NULLPTR时退出

【信创】信创云规划设计建设方案(2024PPT原件)

信创,即“信息技术应用创新”。我国自主信息产业聚焦信息技术应用创新,旨在通过对IT硬件、软件等各个环节的重构,基于我国自有IT底层架构和标准,形成自有开放生态,从根本上解决本质安全问题,实现信息技术可…

【笔试常见编程题06】最近公共祖先、求最大连续bit数、二进制插入、查找组成一个偶数最接近的两个素数

1. 最近公共祖先 将一棵无穷大满二叉树的结点按根结点一层一层地从左往右编号,根结点编号为1。现给定a,b为两个结点。设计一个算法,返回a、b最近的公共祖先的编号。注意其祖先也可能是结点本身。 测试样例: 2,3 返回&a…

Airtest成功案例分享:KLab连续2年携Airtest私有云产品参加CEDEC大会!

一、KLab株式会社介绍 KLab株式会社是一家位于日本的移动游戏开发公司,成立于2000年。公司以开发和运营基于动漫和漫画IP的手机游戏而闻名,尤其是在音乐节奏游戏领域。KLab的一些知名作品包括《LoveLive!学园偶像祭》、《排球少年:新的征程》…

【中项第三版】系统集成项目管理工程师 | 第 11 章 规划过程组② | 11.3 - 11.5

前言 第 11 章对应的内容选择题和案例分析都会进行考查,这一章节属于10大管理的内容,学习要以教材为准。本章上午题分值预计在15分。 目录 11.3 收集需求 11.3.1 主要输入 11.3.2 主要工具与技术 11.3.3 主要输出 11.4 定义范围 11.4.1 主要输入…

【经典面试题】环形链表

1.环形链表oj 2. oj解法 利用快慢指针: /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/typedef struct ListNode ListNode; bool hasCycle(struct ListNode *head) {ListNode* slow head, *fast…

如何在 C 语言中进行选择排序?

🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会! 📙C 语言百万年薪修炼课程 通俗易懂,深入浅出,匠心打磨,死磕细节,6年迭代,看过的人都说好。 文章目…

【Python】已解决:AttributeError: target_names(机器学习中查看数据信息报错)

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决:AttributeError: target_names(机器学习中查看数据信息报错) 一、分析问题背景 在机器学习的数据处理阶段,我们经常需要查看…

使用pip或conda离线下载安装包,使用pip或conda安装离线安装包

使用pip或conda离线下载安装包,使用pip或conda安装离线安装包 一、使用pip离线下载安装包1. 在有网络的机器上下载包和依赖2. 传输离线安装包 二、在目标机器上离线安装pip包三、使用conda离线下载安装包1. 在有网络的机器上下载conda包2. 传输conda包或环境包3. 在…

每日一练 - 理解IGMP组播组信息

下面是路由器 RTB 的部分输出信息, 关于输出信息描述错误的是A.接口上动态加入的组播组个数是 1 B.加入的组播组地址是 225.1.1.2 C.dsplay igmp group 命令用来查看 IGMP 组播组信息,包括通过成员报告动态加入的组播组和通过命令行静态加入的组播组信息 D.最后发…

汇编语言 第四版 王爽 一二章总结

第一章 基础知识 汇编语言的三类指令 1. 汇编指令 汇编指令是直接被CPU执行的指令,它们在汇编时被转换为对应的机器码。主要包括: 数据传送指令:如MOV,用于在寄存器、内存和I/O端口之间传送数据。 MOV AX, BX ; 将BX中的数据传…

【手把手教你使用cgroup配置,十分钟就会】

手把手教你使用cgroup配置,十分钟就会 什么是cgroupcgroup中的参数概念及原理 以 memory为例看下如何配置配置内存限制写一个内存申请脚本执行脚本测试结束语 什么是cgroup cgroups 是Linux内核提供的一种可以限制单个进程或者多个进程所使用资源的机制&#xff0c…

postgres 的dblink使用,远程连接数据库

一.安装下载 dblink create extension if not exists dblink 查看是否已经安装 select * from pg_extension;二.运行,查询数据 其中,第一个参数是dblink名字,也可以是连接字符串。 第二个参数是要执行的SQL查询语句。AS子句用于指定返回结…

“学习Pandas中时间序列的基本操作“

目录 # 开篇 1. 创建和操作时间序列对象 2. 时间序列数据的读取和存储 3. 时间序列数据的索引和切片 4. 时间序列数据的操作和转换 5. 时间序列数据的可视化 6. 处理时间序列中的缺失值 7. 时间序列数据的聚合和分组 8. 时间序列的时间区间和偏移量操作 示例代码&…