98. Python基础教程:try...except...finally语句

news2024/11/26 23:29:04

【目录】

文章目录

    • 1. try...except...finally语法介绍
    • 2. try...except...finally执行顺序
    • 3. 捕获特定类型的异常
    • 4. 捕获所有类型的异常
    • 5. 实操练习-打开txt文件并输出文件内容

【正文】

在今天的课程中,我们将学习Python中的异常处理语句try...except...finally

try...except...finally是Python中的一个异常处理语句。

try...except...finally语句的作用是捕获和处理程序中的异常。

1. try…except…finally语法介绍

try[traɪ]:尝试。

except[ɪkˈsept]:把…排除在外。

finally [ˈfaɪnəli]:最后。

【基本语法】

try:
    # 可能会引发异常的代码块
except ExceptionType1:
    # 异常类型1的处理代码块
except ExceptionType2:
    # 异常类型2的处理代码块
...
finally:
    # 无论是否发生异常,都会执行的代码块

2. try…except…finally执行顺序

  • try代码块中,我们放置可能会引发异常的代码。

  • 如果try代码块中的代码引发了异常,那么程序会跳转到对应的except代码块进行处理。

  • 如果try代码块中代码没有引发异常,那么程序执行try代码块中的代码,except代码块将会被忽略。

  • except代码块可以有多个,每个except代码块用于处理不同类型的异常。

  • 我们可以根据具体的需求,选择捕获和处理特定类型的异常。

  • 无论是否发生异常,finally代码块中的代码最终都会被执行。

  • finally代码块通常用于关闭文件、释放数据库连接或进行一些清理操作。

  • 它的作用是避免资源泄露和内存溢出等问题,从而提高程序的健壮性。

下面,我们通过一些案例来讲解try...except...finally语句的应用。

3. 捕获特定类型的异常

【代码示例:98-1】

try:
    # 可能会出现异常的代码
    x = int(input("请输入第1个整数: "))
    y = int(input("请输入第2个整数: "))
    result = x / y
    print("结果是:", result,'\n')
except ValueError as e:
    # 处理值错误异常
    print("输入的不是整数,请重新输入。", e,'\n')
except ZeroDivisionError as e:
    # 处理除零异常
    print("除数不能为零,请重新输入。", e,'\n')
except Exception as e:
    # 处理其他异常
    print("发生了一个异常:", e,'\n')
finally:
    # 无论是否发生异常,都会执行的代码
    print("程序结束。",'\n')

在上面的代码中,我们尝试将用户输入的两个整数相除,并打印结果。

如果用户输入的不是整数,会捕获到值错误异常,并输出提示信息。

如果用户输入的除数为零,会捕获到除零异常,并输出相应的提示信息。

如果发生其他类型的异常,会捕获到通用的异常,并输出异常信息。

注意无论是否发生异常,最后都会执行finally块中的代码,输出程序结束的提示信息。

【终端输出】

在这里插入图片描述

【温馨提示】

'\n'是一个转义字符,表示换行符。它的作用是在输出中增加一个空行。

我是为了写笔记时框选内容方便而加的换行符,大家可以省略换行符。

【错误代码示例:98-2】

为了输出结果更加清晰易读,我想给input语句也增加一个换行功能。

我想在下面每个输入语句代码后面增加了一个'\n':

x = int(input("请输入第1个整数: "))
y = int(input("请输入第2个整数: "))

增加后的代码如下所示:

x = int(input("请输入第1个整数: ",'\n'))
y = int(input("请输入第2个整数: ",'\n'))

【错误完整代码示例:98-2】

try:
    # 可能会出现异常的代码
    x = int(input("请输入第1个整数: ",'\n'))
    y = int(input("请输入第2个整数: ",'\n'))
    result = x / y
    print("结果是:", result,'\n')
except ValueError as e:
    # 处理值错误异常
    print("输入的不是整数,请重新输入。", e,'\n')
except ZeroDivisionError as e:
    # 处理除零异常
    print("除数不能为零,请重新输入。", e,'\n')
except Exception as e:
    # 处理其他异常
    print("发生了一个异常:", e,'\n')
finally:
    # 无论是否发生异常,都会执行的代码
    print("程序结束。",'\n')

我们来看程序运行的结果。

【终端输出】

在这里插入图片描述

expected [ɪkˈspektɪd] :预期。

at most :至多。

arguments [ˈɑːgjʊmənts]:参数。

运行代码,程序发生input expected at most 1 argument, got 2异常。

报错信息" input expected at most 1 arguments, got 2"表示调用函数时只需要传递1个参数,但是在代码中却传递了两个参数。

x = int(input("请输入第1个整数: ",'\n'))

注意:输入函数input()只能传递一个参数.

但上面的代码中有2个参数,一个是"请输入第1个整数: ",另一个是'\n'

因为多输入了一个'\n',所以程序报错。

4. 捕获所有类型的异常

在不确定可能发生的异常种类的的情况下,我们可以使用Exception来捕获任意类型的异常。

【代码示例:98-3】

try:
    num = int(input("请输入一个整数:"))
    result = 10 / num
    print("结果为:", result)
except Exception as e:
    print("发生了异常:", e)
finally:
    print("程序执行完毕。")

【终端输出】

在这里插入图片描述

【Exception和BaseException的区别】

  • Exception和BaseException是Python中的异常类。

  • Exception是所有异常类的基类,而BaseException是Exception的父类。

  • Exception类是Python中所有内置异常类的基类,它包含了常见的异常情况,如ZeroDivisionError、TypeError等。我们可以使用try-except语句来捕获并处理这些异常。

  • BaseException类是Exception的父类,它是所有内置异常类的根源。它包含了一些特殊的异常情况,如SystemExit、KeyboardInterrupt等。这些异常通常是由Python解释器或操作系统引发的,而不是由我们的代码引发的。因此,我们无法使用try-except语句来捕获不是代码引发的异常。

  • 总的来说,Exception是用于捕获和处理常见异常的基类,而BaseException是用于捕获和处理特殊异常的父类。在编写代码时,我们通常使用Exception来捕获和处理异常,而不需要直接使用BaseException。

5. 实操练习-打开txt文件并输出文件内容

【目标任务】

编写一个程序,要求用户输入一个文件名,然后尝试打开该文件并读取其中的内容。

如果文件不存在,捕获异常并输出错误提示信息,最后用finally关闭文件。

【准备工作】

新建一个联系方式.txt文件,文件内容如下:

安迪python学习笔记
xyz77520520

文件存储的绝对路径如下:

D:\安迪笔记\1.基础语法\98\联系方式.txt

我用的vscode编辑器,编辑器打开的文件夹是【安迪笔记】,因此联系方式.txt文件的相对路径如下:

1.基础语法\98\联系方式.txt

67. Python的绝对路径

68. Python的相对路径

vscode编辑器也可以快速查看文件的路径,具体参考上面的笔记。

【安迪碎碎念】

我在编写代码时,如果题目要求写输入语句,我起初都会省略输入语句,而是先采取赋值的方式来完成代码。

这样做的好处是如果代码有异常,可以快速的查找错误,避免在终端输入时浪费过多时间,且很多新手终端输入时更容易出错。

【代码示例:98-4】

我先省略输入语句。

try:
    file = open('1.基础语法\98\联系方式.txt', 'r', encoding="utf-8")
    content = file.read()
    print(content)
except Exception as e:
    print("发生了异常:", e)
finally:
    file.close()
    print("文件已关闭!")

【终端显示】

在这里插入图片描述

我们添加上输入语句:

【代码示例:98-5】

try:
    filename = input("请输入文件名:")
    print('\n')
    file = open(filename, 'r', encoding="utf-8")
    content = file.read()
    print(content)
except Exception as e:
    print("发生了异常:", e,'\n')
finally:
    file.close()
    print("文件已关闭!")

当我在终端输入联系方式.txt时,终端显示如下图所示:

【终端输出】

在这里插入图片描述

【报错解析】

[Errno 2] No such file or directory: 'filename ' 意思是没有这样的文件或目录。

当出现报错[Errno 2] No such file or directory: 'filename'时,通常是因为指定的文件或目录不存在。

这个错误可能有几种可能的原因:

  • 首先,可能是文件或目录的路径不正确,即文件或目录不存在于指定的路径中。

  • 其次,可能是文件或目录的权限设置不正确,导致无法访问。

  • 最后,可能是文件或目录被误删或移动到其他位置。

这里是因为我们输入的不是文件正确的路径,因此程序报错。

NameError: name 'file' is not defined意思是在代码中使用了一个未定义的变量或函数名file

这个错误是因为在finally块中,file变量没有定义。

这是因为在try块中的代码发生了异常,程序没有执行完try块中的代码,因此file变量就没有被定义。

然后程序执行except块中的语句,输出异常原因。

最后,程序执行finally块的file.close()时,因为file变量就没有被定义,所以程序报错输出NameError: name 'file' is not defined

只要我们输入正确的路径,程序就能正常输出了。

运行程序,在终端输入1.基础语法\98\联系方式.txt

在这里插入图片描述

【代码解析】

try:
    filename = input("请输入文件名:")
    print('\n')
    file = open(filename, 'r', encoding="utf-8")
    content = file.read()
    print(content)
except Exception as e:
    print("发生了异常:", e,'\n')
finally:
    file.close()
    print("文件已关闭!")

总体框架使用try-except-finally结构来处理异常。

filename = input("请输入文件名:")

第2行:提示用户输入文件名,并将输入的文件名赋值给变量filename,注意这里要输入的文件名是文件的绝对路径或相对路径。

如果你只想输入文件的名称联系方式.txt作为文件的相对路径,那你可以将.py文件和.txt文件存储在同一个文件夹里,并且用vscode编辑器直接打开该文件夹,这样文件名就是文件的相对路径了。

print('\n')

第3行:打印一个换行符。

file = open(filename, 'r', encoding="utf-8")

第4行:使用open()函数以只读模式打开文件,指定编码为utf-8,并将打开的文件对象赋值给变量file。

open函数语法回顾

open(filename, mode, encoding)
  • filename:要打开的文件名(包括路径)。
  • mode:打开文件的模式,可以是 'r'(只读模式,默认值)、'w'(写入模式,会覆盖文件中的内容)、'a'(追加模式,在文件末尾添加内容)等。
  • encoding:指定文件的编码方式,默认为 None,表示使用系统默认编码。常用的编码方式有 'utf-8''gbk' 等。
content = file.read()

第5行:使用read()方法读取文件的全部内容,并将内容赋值给变量content。

read()方法是文件对象的一个方法,用于读取文件的内容。

它没有参数,调用该方法会将整个文件的内容读取出来,并返回一个字符串。

read()方法语法回顾

file.read()

file是一个文件对象,可以通过open()函数打开一个文件获得该文件对象。

read是方法名。

read()方法会从文件的当前位置开始读取内容,读取到文件末尾时停止。

读取的内容会以字符串的形式返回,并赋值给变量content。

print(content)

第6行:打印文件的内容。

except Exception as e:

第7行:捕获异常,并将异常对象赋值给变量e。

print("发生了异常:", e,'\n')

第8行:输出异常内容。

finally:

第9行:finally块中的代码始终会执行,无论是否发生异常。

file.close()

第10行:关闭文件。

print("文件已关闭!")

第11行:打印提示信息,表示文件已关闭。

【错误代码示例】

try:
    filename = input("请输入文件名:")
    print('\n')
    file = open(`filename`, 'r', encoding="utf-8")
    content = file.read()
    print(content)
except Exception as e:
    print("发生了异常:", e,'\n')
finally:
    file.close()
    print("文件已关闭!")

上面的代码是错误,不管你在终端输入什么,程序都会报错。

这也是很多同学容易犯的错误,有兴趣的同学找找看错误在哪里吧!

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

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

相关文章

excel英语翻译让你的数据更容易被理解

从前有一个名叫小明的办公室职员,他每天都要处理大量的数据和报表。然而,由于工作需要,他经常收到来自不同国家的Excel表格,这些表格上的内容都是用各种各样的语言编写的,让他很难理解其中的意思。这时,小明…

Qt Creator 11 开放源码集成开发环境新增集成终端和 GitHub Copilot 支持

导读Qt 项目今天发布了 Qt Creator 11,这是一款开源、免费、跨平台 IDE(集成开发环境)软件的最新稳定版本,适用于 GNU/Linux、macOS 和 Windows 平台。 Qt Creator 11 的亮点包括支持标签、多外壳、颜色和字体的集成终端模拟器&am…

建模教程:如何利用3ds Max 和 After Effects 实现多通道渲染和后期合成

推荐: NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 1. 创建基本场景 步骤 1 打开 3ds Max。在 透视视口。 打开 3ds Max 步骤 2 做一个茶壶,放在飞机上。 制作茶壶 步骤 3 我在场景中应用了几个灯光。我选择了光线追踪阴影作为阴影。 光线追…

走进人工智能| 智能物联网 AIoT的魅力交织

前言: AIIoT是指人工智能(AI)与物联网(IoT)的结合。智能物联网是一种技术体系,通过连接和集成物理设备、传感器和互联网,实现设备之间的智能交互和数据共享,为人们提供智能化、自动化…

赛车游戏——【极品飞车】(内含源码inscode在线运行)

前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 「推荐专栏」: ★java一站式服务 ★ ★前端炫酷代码分享 ★ ★ uniapp-从构建到提升★ ★ 从0到英雄,vue成神之路★ ★ 解决算法,一个专栏就够了★ ★ 架…

IEEE 802.11——无线局域网的重要里程碑

概要 无线局域网(Wireless Local Area Network,WLAN)已经成为现代生活中不可或缺的一部分,它为我们提供了便捷的无线网络连接,让我们能够在家中、办公室、公共场所等地轻松上网。在无线局域网技术的发展过程中&#x…

【C++】模板进阶(模板的特化,非类型模板参数,模板的分离编译)

文章目录 一、模板使用时一定要加typename的情况二、 非类型模板参数三、模板的特化1.函数模板特化2.类模板特化1.全特化:2. 偏特化:1. 部分特化2.参数更一步限制 四、模板的分离编译1.Stack.h2.Stack.cpp(定义)3.test.cpp 一、模板使用时一定要加typena…

【taro react】---- 获取元素的位置和宽高等信息

1. 需求分析 添加节点的布局位置的查询请求。相对于显示区域,以像素为单位。其功能类似于 DOM 的 getBoundingClientRect。返回 NodesRef 对应的 SelectorQuery。区分小程序和H5的环境,调用 getBoundingClientRect 获取对应的信息。 2. H5 实现 判断传…

根据前序和中序遍历序列构造二叉树 (递归+迭代两种方法实现)

给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。 输入: preorder [3,9,20,15,7], inorder [9,3,15,20,7] 输出: [3,9,20,null,null,15,7]源代码如下…

113、单例Bean是单例模式吗?

单例Bean是单例模式吗? 通常来说,单例模式是指在一个JVM中,一个类只能构造出来一个对象,有很多方法来实现单例模式,比如懒汉模式,但是我们通常讲的单例模式有一个前提条件就是规定在一个JVM中,那如果要在两个JVM中保证单例呢?那可能就要用分布式锁这些技术,这里的重点…

wangzherongyao yase

17132血量出装,60%物理抗性,57%法扛的亚瑟,打野刀爆裂提高移动#王者荣耀#亚瑟,后期红莲烧664左右打野刀烧254左右,被动天赋回血也非常快 亚瑟打这些纯输出上单跟砍瓜切菜一样

软考 系统分析师和系统架构师 项目管理师

软考整起 https://www.ruankao.org.cn/ 什么是计算机技术与软件(初级、中级、高级)考试(软考)? - 知乎 系统分析师和系统架构师关系 这两年,我先后报考了计算机技术与软件专业技术资格(水平&a…

基于ARM+FPGA的驱控一体机器人控制器设计

目前市场上工业机器人,数控机床等多轴运动控制系统普遍采用运动控制器加 伺服驱动器的分布式控制方式。在这种控制方式中,控制器一方面完成人机交互,另 一方面进行 NC 代码的解释执行,插补运算,继而将计算出来的位…

rsync远程同步+inotify实时同步部署

文章目录 一、rsync简介1.rsync同步方式2、备份的方式3.rsync同步源 二、rsync命令基本用法三、配置源的两种表达方法四、配置服务端与客户端的实验1.将 Master 服务器数据备份到 Slave 服务器2.配置RsyncInotify 实时同步 五、rsync的应用场景总结 一、rsync简介 Rsync&#…

MySQL 储存过程

前言 存储过程(Stored Procedure)是一组预定义的SQL语句集合,它们被保存在数据库中并可供重复调用。存储过程可以接受参数、执行查询和更新操作,并返回结果。使用存储过程,可以实现复杂的业务逻辑和数据操作&#xff0…

浅谈微服务异步解决方案

导言 异步是一种设计思想,不是设计目的,因此不要为了异步而异步,要有所为,有所不为。 异步不是『银弹』, 避免试图套用一个『异步框架』解决所有问题, 需要根据不同的业务特点或要求,选择合适的…

助力青少年科技创新人才培养,猿辅导投资1亿元设立新基金

近日,在日本千叶县举办的2023年第64届国际数学奥林匹克(IMO)竞赛公布比赛结果,中国队连续5年获得团体第一。奖牌榜显示,代表中国参赛的6名队员全部获得金牌。其中,猿辅导学员王淳稷、孙启傲分别以42分、39分…

Ubuntu 离线部署的常见操作

Ubuntu 离线安装的常见操作 **说明:**很多情况下,生产环境都是离线环境,然而开发环境都是互联网的环境,因此部署的过程中需要构建离线安装包; 1. 下载但是不安装 # 例如使用 apt 下载 wireshark 安装包 sudo apt download wireshark # 下载…

gitee修改代码提交操作步骤说明

一,简介 本文主要介绍如何从gitee仓库下载文件,本地修改,本地提交,然后再push到远程服务器的操作步骤。供参考,欢迎一起讨论交流~ 二,操作步骤 总的操作步骤分为以下几步 1,远程服务器下载文…

Seata的四种分布式事务模式

文章目录 一、XA模式1、XA模式原理2、seata的XA模式3、优缺点4、代码实现 一、XA模式 1、XA模式原理 XA 规范 是 X/Open 组织定义的分布式事务处理(DTP,Distributed Transaction Processing)标准,XA 规范 描述了全局的TM与局部的…