【Python基础知识-pycharm版】第十节_异常

第十节

  • 异常
    • 异常机制本质
    • 异常解决的关键:定位
    • try... 一个 except 结构
    • try... 多个 except 结构
    • try...except...else 结 构
    • try...except...finally 结构
    • return 语句和异常处理问题
    • 常见异常的解决
    • 常见异常汇总
    • with 上下文管理
    • trackback 模块
    • 自定义异常类

异常

在实际工作中,我们遇到的情况不可能是非常完美的。比如:你写的某个模块,用户输入不一定符合你的要求;你的程序要打开某个文件,这个文件可能不存在或者文件格式不对;你要读取数据库的数据,数据可能是空的;我们的程序再运行着,但是内存或硬盘可能满了等等。
软件程序在运行过程中,非常可能遇到刚刚提到的这些问题,我们称之为异常,英文是:Exception,意思是例外。遇到这些例外情况,或者叫异常,我们怎么让写的程序做出合理的处理,而不至于程序崩溃呢?我们本章就要讲解这些问题。
如果我们要拷贝一个文件,在没有异常机制的情况下,我们需要考虑各种异常情况,伪代码如下:
伪代码使用 if 处理程序中可能出现的各种情况

#将d:/a.txt 拷贝到e:盘
if 'd:/a.txt'这个文件存在:if e盘的空间大于 a.txt 文件长度:if 文件复制一半 IO 流断掉:停止 copy,输出:IO 流出问题!else:copyFile("d:/a.txt", "e:/a.txt")elseprint(e "e 盘空间不够存放 a.txt !" ")else:print(t "a.txt 不存在!" ")

这种方式,有两个坏处:

  1. 逻辑代码和错误处理代码放一起!
  2. 程序员本身需要考虑的例外情况较复杂,对程序员本身要求较高!
    那么,我们如何解决应对异常情况呢? python 的异常机制给我们提供了方便的处理方式。如上情况,如果是用 python 的异常机制来处理,示意代码如下(仅限示意,不能运行):
#将 d:/a.txt 拷贝到 e:盘
try:copyFile( "d:/a.txt", "e:/a.txt")
except:print(" " 文件无法拷贝" ")

异常机制本质

异常指程序运行过程中出现的非正常现象,例如用户输入错误、除数为零、需要处理的文件不存在、数组下标越界等。
所谓异常处理,就是指程序在出现问题时依然可以正确的执行剩余的程序,而不会因为异常而终止程序执行。
python 中,引进了很多用来描述和处理异常的类,称为异常类。异常类定义中包含了该类异常的信息和对异常进行处理的方法。下面较为完整的展示了python 中内建异常类的继承层次:
在这里插入图片描述
我们处理一下,遇到的第一个异常:

#测试简单的 0 不能做除数异常
a = 3/0
D:\softwares\anaconda3\python.exe D:/PycharmProjects/MyTest/Day0723/myerror01.py
Traceback (most recent call last):File "D:/PycharmProjects/MyTest/Day0723/myerror01.py", line 30, in <module>a = 3/0
ZeroDivisionError: division by zeroProcess finished with exit code 1

python 中一切都是对象,异常也采用对象的方式来处理。处理过程:

  1. 抛出异常:在执行一个方法时,如果发生异常,则这个方法生成代表该异常的一个对象,停止当前执行路径,并把异常对象提交给解释器。
  2. 捕获异常:解释器得到该异常后,寻找相应的代码来处理该异常。

异常解决的关键:定位

当发生异常时,解释器会报相关的错误信息,并会在控制台打印出相关错误信息。我们只需按照从上到下的顺序即可追(Trackback)错误发生的过程,最终定位引起错误的那一行代码。
【示例】追溯异常发生的过程

#测试简单的 0 不能做除数异常
# a = 3/0def a():print('run in a() start!')num=1/0print('run in a() end! ')
def b():print('run in b() start!')a()print('run in b() end! ')
def c():print('run in c() start!')b()print('run in c() end! ')
print('step1')
c()
print('step2')
Traceback (most recent call last):
step1File "D:/PycharmProjects/MyTest/Day0723/myerror01.py", line 45, in <module>
run in c() start!c()File "D:/PycharmProjects/MyTest/Day0723/myerror01.py", line 42, in cb()File "D:/PycharmProjects/MyTest/Day0723/myerror01.py", line 38, in ba()File "D:/PycharmProjects/MyTest/Day0723/myerror01.py", line 34, in anum=1/0
ZeroDivisionError: division by zero
run in b() start!
run in a() start!Process finished with exit code 1

try… 一个 except 结构

try…except 是最常见的异常处理结构。结构如下:

try:
被监控的可能引发异常的语句块
except BaseException [as e]:
异常处理语句块

try 块包含着可能引发异常的代码,except 块则用来捕捉和处理发生的异常。执行的时候,如果 try 块中没有引发异常,则跳过 ecept 块继续执行后续代码;执行的时候,如果 try块中发生了异常,则跳过 try 块中的后续代码,跳到相应的 except 块中处理异常;异常处理完后,继续执行后续代码。
在这里插入图片描述

try:print('step1')a=3/0print('step2')
except BaseException as e:print('step3')print(e)print('step4')
step1
step3
division by zero
step4Process finished with exit code 0
#测试简单的0不能做除数异常
try:print('step1')a=3/2print('step2')
except BaseException as e:print('step3')print(e)print('step4')
step1
step2
step4Process finished with exit code 0

示例:循环输入数字,如果不是数字则处理异常;直到输入 88,则结束循环。

while True:try:x= int(input('请输入一个数字:'))print('您输入的数字是:',x)if x==88:print('退出程序')breakexcept:print('异常:输入的不是一个数字')
请输入一个数字:89
您输入的数字是: 89
请输入一个数字:88
您输入的数字是: 88
退出程序Process finished with exit code 0

try… 多个 except 结构

上面的结构可以捕获所有的异常,工作中也很常见。但是,从经典理论考虑,一般建议尽量捕获可能出现的多个异常(按照先子类后父类的顺序),并且针对性的写出异常处理代码。为了避免遗漏可能出现的异常,可以在最后增加 BaseException。结构如下:
try:
被监控的、可能引发异常的语句块
except Exception1:
处理 Exception1 的语句块
except Exception2:
处理 Exception2 的语句块

except BaseException:
处理可能遗漏的异常的语句块

示例:多个 except 结构

try:a=input('请输入被除数:')b=input('请输入除数:')c=float(a)/float(b)print(c)except ZeroDivisionError:print('异常:除数不能为0')
except TypeError:print('异常:除数和被除数都应该为数值类型')
except NameError:print('异常:变量名不存在')
except BaseException as e:print(e)print(type(e))
请输入被除数:20
请输入除数:0
异常:除数不能为0Process finished with exit code 0

try…except…else 结 构

try…except…else 结构增加了“else 块”。如果 try 块中没有抛出异常,则执行 else 块。如果try 块中抛出异常,则执行 except 块,不执行 else 块。

try:a=input('请输入被除数:')b=input('请输入除数:')c=float(a)/float(b)
except BaseException as e:print(e)
else:print('除的结果是:',c)

没有发生异常的执行情况(执行完 try 块后,执行 else):

请输入被除数:25
请输入除数:0
float division by zeroProcess finished with exit code 0
请输入被除数:50
请输入除数:2
除的结果是: 25.0Process finished with exit code 0

try…except…finally 结构

try…except…finally 结构中,finally 块无论是否发生异常都会被执行;通常用来释放 try 块中申请的资源。
【示例】try…except…finally 结构简单测试

try:a=input('请输入被除数:')b=input('请输入除数:')c=float(a)/float(b)
except BaseException as e:print(e)
else:print('除的结果是:',c)
finally:print('我是finally中的语句,无论发生异常与否,都执行')
print('程序结束!')
请输入被除数:50
请输入除数:2
除的结果是: 25.0
我是finally中的语句,无论发生异常与否,都执行
程序结束!Process finished with exit code 0
请输入被除数:50
请输入除数:0
float division by zero
我是finally中的语句,无论发生异常与否,都执行
程序结束!Process finished with exit code 0

【示例】读取文件,finally 中保证关闭文件资源

try:f= open('d:/a.txt',r)content=f.readline()print(content)
except BaseException as e:print(e)
finally:f.close() #释放资源。此处也可能会发生异常。若发生异常则程序终止,不会继续往下执行
print('step4')
Traceback (most recent call last):
name 'r' is not definedFile "D:/PycharmProjects/MyTest/Day0723/myerror01.py", line 117, in <module>f.close() #释放资源。此处也可能会发生异常。若发生异常则程序终止,不会继续往下执行
NameError: name 'f' is not definedProcess finished with exit code 1

return 语句和异常处理问题

由于 return 有两种作用:结束方法运行、返回值。我们一般不把 return 放到异常处理结构中,而是放到方法最后。
【示例】return 和异常结构的正确处理方式

def test01():print( "step1")try:x = 3/0# return "a"except:print( "step2")print("异常:0 0 不能做除数 ")#return "b"finally:print( "step4")#return "d"print( "step5")return "e" #一般不要将 return 语句放到 try、except、else、finally 块中,会发生一些意想不到的错误。建议放到方法最后。
print(test01())
step1
step2
异常:0 0 不能做除数 
step4
step5
eProcess finished with exit code 0

常见异常的解决

Python 中的异常都派生自 BaseException 类,本节我们测试和列出常见的一些异常,方便初学者掌握。
在这里插入图片描述
在这里插入图片描述

常见异常汇总

在这里插入图片描述在这里插入图片描述

with 上下文管理

finally 块由于是否发生异常都会执行,通常我们放释放资源的代码。其实,我们可以通过 with 上下文管理,更方便的实现释放资源的操作。
with 上下文管理的语法结构如下:
with context_expr [ as var]:
语句块

with 上下文管理可以自动管理资源,在 with 代码块执行完毕后自动还原进入该代码之前的现场或上下文。不论何种原因跳出 with 块,不论是否有异常,总能保证资源正常释放。极大的简化了工作,在文件操作、网络通信相关的场合非常常用。

【示例】with 上下文管理文件操作
在这里插入图片描述

trackback 模块

【示例】使用 Traceback 模块打印异常信息
在这里插入图片描述
【示例】使用 traceback 将异常信息写入日志文件
在这里插入图片描述

自定义异常类

程序开发中,有时候我们也需要自己定义异常类。自定义异常类一般都是运行时异常,通常继承 Exception 或其子类即可。命名一般以 Error、Exception 为后缀。
自定义异常由 raise 语句主动抛出。

【示例】自定义异常类和 raise 语句

#测试自定义异常类class AgeError(Exception):  #继承Exceptiondef __init__(self,errorInfo):Exception.__init__(self)self.errorInfo=errorInfodef __str__(self):return str(self.errorInfo)+'年龄错误!应该在1-150之间'######################测试代码################################
if __name__=='__main__': #如果为ture,则模块是作为独立文件运行,可以执行测试代码age= int(input('输入一个年龄:'))if age<1 or age>150:raise AgeError(age)else:print('正常的年龄:',age)
输入一个年龄:300
Traceback (most recent call last):File "D:/PycharmProjects/MyTest/Day0723/myerror01.py", line 149, in <module>raise AgeError(age)
__main__.AgeError: 300年龄错误!应该在1-150之间Process finished with exit code 1

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

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

相关文章

k8s挂载目录_拥抱云原生,如何将开源项目用k8s部署?

k8s以及云原生相关概念近年来一直比较火热&#xff0c;阿丸最近搞了个相关项目&#xff0c;小结一下。本文将重点分享阿里开源项目otter适配k8s部署的改造过程&#xff0c;其中的改造过程和技巧应该适用于将大多数开源项目改造到k8s进行部署。1.背景otter是阿里开源的分布式数据…

LeetCode 1870. 准时到达的列车最小时速(二分查找)

文章目录1. 题目2. 解题2.1 模拟超时2.2 二分查找1. 题目 给你一个浮点数 hour &#xff0c;表示你到达办公室可用的总通勤时间。 要到达办公室&#xff0c;你必须按给定次序乘坐 n 趟列车。 另给你一个长度为 n 的整数数组 dist &#xff0c;其中 dist[i] 表示第 i 趟列车的行…

【Python基础知识-pycharm版】第十一节-文件操作(IO技术)

第十一节-文件操作&#xff08;IO技术&#xff09;文本文件和二进制文件文件操作相关模块概述创建文件对象 open()文本文件的写入基本的文件写入操作常用编码介绍ASCIIISO8859-1GB2312,GBK,GB18030中文乱码问题write()/writelines()写入数据close()关闭文件流with 语句(上下文管…

LeetCode 1871. 跳跃游戏 VII(贪心)

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始的二进制字符串 s 和两个整数 minJump 和 maxJump 。 一开始&#xff0c;你在下标 0 处&#xff0c;且该位置的值一定为 0 。 当同时满足如下条件时&#xff0c;你可以从下标 i 移动到下标 j 处&#xff1a; i minJump …

pcb外观维修_「维修案例」泰克AFG3021函数任意波形发生器故障维修

在产品调试的过程中&#xff0c;大多数的电路需要输入某种幅度随时间变化的信号&#xff0c;在这样的应用场景中&#xff0c;一个完整的测试测量系统一般会包含激励源&#xff0c;被测件和采集仪器三个部分。采集仪器通常使用的是示波器和逻辑分析仪&#xff0c;而信号源在系统…

设计模式--迭代器模式

实验18&#xff1a;迭代器模式 本次实验属于模仿型实验&#xff0c;通过本次实验学生将掌握以下内容&#xff1a; 1、理解迭代器模式的动机&#xff0c;掌握该模式的结构&#xff1b; 2、能够利用迭代器模式解决实际问题。 [实验任务]&#xff1a;JAVA和C常见数据结构迭代…

4k视频分辨率的码流_8K电视来了!但是8K视频仍很遥远

本届CES上&#xff0c;8K电视的集体发布可谓一大亮点&#xff0c;索尼、LG、TCL、三星等厂商纷纷推出8K电视。不光如此&#xff0c;本届CES上夏普突如其来的展示了一款具备8K视频拍摄功能的M43相机&#xff0c;这一点着实是出乎意料。今天我们就来讨论一下&#xff0c;在8K电视…

LeetCode 1707. 与数组中元素的最大异或值(Trie树)

文章目录1. 题目2. 解题1. 题目 给你一个由非负整数组成的数组 nums 。另有一个查询数组 queries &#xff0c;其中 queries[i] [xi, mi] 。 第 i 个查询的答案是 xi 和任何 nums 数组中不超过 mi 的元素按位异或&#xff08;XOR&#xff09;得到的最大值。 换句话说&#x…

我的爬虫第一天

爬虫一个简单的爬虫&#xff1a;1.安装request2.测试是否安装成功3.新建项目4.使用requests请求网页4.如何用python解析网页源码5.简单的保存数据的方法一个简单的爬虫&#xff1a; 1.安装request pip install requests2.测试是否安装成功 输入python import requests不报…

qr分解求线性方程组_计算方法/数值分析第三章 线性方程组的数值解法

主要内容&#xff1a;1、引言2、高斯消去法3、直接分解法4、解线性方程组的迭代法5、向量范数、矩阵范数及迭代法的收敛性第一节 引言用克拉姆求解线性方程组第二节 高斯消去法高斯消去法是一种古老的直接法&#xff0c;其基本思想是通过消元将线性方程组的求解问题转化成三角形…

python 执行完成后,cmd窗口自动关闭

一般脚本运行完需要点击一下 在代码最后添加以下内容即可自动关闭cmd&#xff1a; import os import time time.sleep(1) # 方便展示&#xff0c;可删除 os.system("taskkill /f /im cmd.exe") # 关闭cmd窗口

txt文件可存储最大值_Verilog边码边学:十六进制文件读取$readmemh

系统任务$readmemh读取十六进制文件。$readmemh的作用是将文件中的数据一次性的读入某个数组中&#xff0c;然后可以依次从数组中取出单个的数据进行处理。读取的内容只包括空白位置(空格、换行、制表格)、注释行、十六进制的数字。语法结构中的起始地址与终止地址可省略。【语…

什么叫诚实_他爱不爱你,身体最诚实

文字&#xff1a;嘉一 声音&#xff1a;三三有位听友给我发私信说&#xff1a;“他看我的眼神变了&#xff0c;也不喜欢和我说话了&#xff0c;更懒得为我做任何事了&#xff0c;这段感情真的没意思了。”我回她&#xff1a;“一个人爱不爱你&#xff0c;身体最诚实。嘴巴可以…

【机器学习-数据科学】第一节:numpypandas

numpy&pandas安装numpy&pandasarray创建numpy的基础运算numpy的索引numpy的 array 合并numpy的 array分割numpy的 copy & deep copy安装numpy&pandas import numpy as np arraynp.array([[1,2,3],[2,3,4]])# 将数组转化为矩阵 print(array) #打印矩阵 print(nu…

【机器学习-数据科学】第二节:ipython开发环境搭建以及pandas快速入门

ipython开发环境搭建以及pandas快速入门0.开发环境搭建技巧网页版ipython&#xff1a;ipython notebooknumpy1.pandas 快速入门一导入创建对象2. pandas 快速入门二空数据处理apply的用法count和mode函数数据合并3. pandas 快速入门三数据整形数据透视时间序列数据可视化数据载…

pytorch图像和张量的相互转换_Day107:Pytorch张量类型的构建与相互转换

张量的作用Pytorch的数据类型为各式各样的Tensor&#xff0c;Tensor可以理解为高维矩阵(与Numpy中的Array类似)通过使用Type函数可以查看变量类型。一CPU张量类型Pytorch中的tensor包括七种CPU张量类型和八种GPU张量类型&#xff0c;这里我们就只讲解一下CPU中的&#xff0c;GP…

漂亮的html页面源码_爬虫数据分析之html

1、 htmlhtml 不是一种编程语言&#xff0c;而是一种标记语言&#xff0c;是制作网页所必须的&#xff0c;你在浏览器里看到的每一个页面&#xff0c;不论简单还是复杂&#xff0c;都是用html编写的&#xff0c;包括你现在看到的这篇文章。用html写一个简单的页面&#xff0c;是…

LeetCode 1864. 构成交替字符串需要的最小交换次数

文章目录1. 题目2. 解题1. 题目 给你一个二进制字符串 s &#xff0c;现需要将其转化为一个 交替字符串 。 请你计算并返回转化所需的 最小 字符交换次数&#xff0c;如果无法完成转化&#xff0c;返回 -1 。 交替字符串 是指&#xff1a;相邻字符之间不存在相等情况的字符串…

【机器学习-数据科学】第三节:数据分析实例 分析MovieLens电影数据

数据分析实例 分析MovieLens电影数据导入数据数据合并按性别查看各个电影的平均评分活跃电影排行榜电影投票数据 grouplens.org/datasets/movielens 把文件放到这个路径下 导入数据 数据合并 按性别查看各个电影的平均评分 查看男女评分差别最大的 按照diff去排序 找出分歧…

vue路由切换组件没有加载_Vue面试题: 如何实现路由懒加载?

非懒加载import List from /components/list.vue const router new VueRouter({routes: [{ path: /list, component: List }] })方案一(常用)const List () > import(/components/list.vue) const router new VueRouter({routes: [{ path: /list, component: List }] })方…