Python实用教程系列——异常处理

2024-03-27 09:38

本文主要是介绍Python实用教程系列——异常处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前几篇文章写的是关于Xlwings的相关知识,介绍了其相关API的使用方法,大家在使用Xlwing对Excel进行操作的时候,就可以使用推文中介绍的方法完成自己的任务。关于其与VBA的结合的使用,等后期遇到比较好项目的时候我再跟大家介绍。

从现在开始,将开启新的写作《Python实用教程系列》,主要是针对自己在项目中,对那些平时使用频率较高的,觉得重要的知识点进行总结和归纳,以更好的帮助大家在写代码的时候起到举一反三的作用,闲话不多说,这个系列的开篇我们就从-异常处理讲起!

百度百科中对异常处理的介绍为:异常处理,是编程语言或计算机硬件里的一种机制,用于处理软件或信息系统中出现的异常状况(即超出程序正常执行流程的某些特殊条件)。从这个角度来看,异常处理是保证程序正常运行关键,因此异常处理是非常重要的!

在Python中,处理异常的基类是:BaseException,各个异常具体如下所示:

一、异常分类

基类BaseException中有一个异常类Warning,这个Warning我们应该遇见的次数很多了,比如我们在运行代码的时候,比如某一个要模块版本过低的时候会出现这样的告警。

记下来我们来介绍上述所列的几个常见异常:

1. AttributeError

class Car():def __init__(self):self.car_lenth = 3.5self.car_height = 1.7self.car_name = 'Benz'
new_car = Car
print(new_car.car_width)

上述代码最后一行代码试图访问不存在的属性car_width,这将抛出一下的异常:

AttributeError: type object 'Car' has no attribute 'car_width'

 

2. IndexError

def len_list(number):print(number[len(number)] + 1)
len_list([1,2,3,4,5])

上述代码试图访问超出列表的索引进行取值,这将抛出异常:

IndexError: list index out of range

 

3. KeyError

def visit_dic(dic_num):print(dic_num['4'])
dic_123 = {'1':'我', '2':'爱', '3':'python学堂'}
visit_dic(dic_123['4'])

上述代码试图访问字典dic_123中不存在的键值,这将抛出KeyError: '4'异常

4. NameError

def name_err():print(name)
name_err()

上述代码中,函数name_err()中试图打印不存在的name对象,将抛出异常:

NameError: name 'name' is not defined

 

5. OSError

def open_file(filename):file=open(filename)
file = r'C:\Users\TEN\Desktop\'1.txt'
open_file(file)

上述代码试图打开桌面一个不存在的文件1.txt,这将抛出OSError异常:

FileNotFoundError:[Errno2]No such file or directory:

"C:\\Users\\TEN\\Desktop\\'1.txt"

 

值的一提的是在python3.3版本以后,IOError(有关于输入输出的异常)将并到OSError中,看上述Xmind图可知FileNotFoundError属于OSError类。

6. SyntaxError

def syn_error():print('python知识学堂')print('今天天气好)
syn_error()

上述代码第二行的print打印测时候,少了一个“’”,将抛出异常:

SyntaxError: EOL while scanning string literal

 

7. TypeError

def add_number(parameter1, parameter2):sum = parameter1 + parameter2return sum
total = add_number(1, 2, 3)
print(total)

上述代码的函数add_number接受2个参数,第五行代码传入了3个参数,这将抛出类型错误的异常:

TypeError: add_number() takes 2 positional arguments but 3 were given

 

综上,我们看了7种类型的异常。那么很显然想到的就是,出现的这些异常我们该怎么处理呢?接下来我们就将介绍处理异常的一些方法:

二、Try-except

异常是使用try-except来进行处理的,使用try-except的好处就是可以让python执行指定的操作,可以人为定义一些面向用户友好的一些错误信息,帮助用户定位错误。在实际的项目中,我们把可能出现异常的代码块放在try中,以便排除异常并保证其余代码正常运行而不退出。

比如我们使用try-except处理一个ZeroDivisionError异常:

try:print(100/0)
except ZeroDivisionError:print('分母不能为0')

这里出现错误的代码被放在了try中,如果try中的代码没有问题,python将跳过except中的代码;如果try中的代码出现问题,则会执行except中的代码。

这里有一个技巧,就是else模块的使用,比如:

try:print(100/1)
except ZeroDivisionError:print('分母不能为0')
else:print('python')

上述代码输出:100.0,python。使用else的好处就是可以让代码继续执行,即使遇到一些可能的错误,作为一种选择性的继续执行时非常nice的。

在抛出异常的时候,我们可以使用except error_type as errorname:的形式,那么使用print(errorname)就可以打印异常对象了,十分方便。

try:print(100/0)
except ZeroDivisionError as zeror:print('分母不能为0')print(zeror)
else:print('python')

三、多except

在实际的项目中,我们在一段代码中需要处理的异常不只一个,比如要同时处理ArithmeticErrorValueErrorArithmeticErrorZeroDivisionError的父类,这个时候我们就可以使用多Try-except方法了,该方法就可以进行多重异常的捕获了哦。

try:file = open(r'C:\Users\TEN\Desktop\1.txt')  # 桌面不存在文件1.txtprint(100/0)print(100/2)
except ZeroDivisionError as zeror:print('分母不能为0')
except FileNotFoundError as fn:print(fn)print('python')
else:print('运行结束')

程序正常运行且上述代码输出:

[Errno 2] No such file or directory: "C:\\Users\\TEN\\Desktop\\'1.txt"

python

 

上述代码使用多个except来进行不同的异常处理,大家可以好好研究一下其中的打印为什么是这样。

四、嵌套Try-except

在实际的项目中我们可能还会遇到这样的情况:在一个try-except中处理了一个异常,在这个异常处理之中我们还要进行异常的处理,此时就需要使用嵌套Try-except了,正好python中也是支持这个嵌套的。我们来看一个实际的例子,来感受一下:

def trying_test():try:try:print(100/0)except:print('分母不能为0')try:file = open(r'C:\Users\TEN\Desktop\1.txt')except FileNotFoundError as fn:print(fn)except:print('python')finally:print('最后的打印')
trying_test ()

上述代码运行输出:

分母不能为0

[Errno 2] No such file or directory: "C:\\Users\\TEN\\Desktop\\'1.txt"

最后的打印

 

上述两个嵌套的try-except被嵌套在第一个代码中,精确的说就是两个try-except被放在try代码块中,当然了实际的开发中我们也可与将要被嵌套的try-except放在except的代码块中。Python的traceback提供了一个print_exc()函数可以帮助我们打印一些异常的信息,有兴趣的小伙伴可以查阅一下相关的文档。

有的小伙伴注意到上述中有一个finally,这个finally的一个好处就是在异常抛出的之后,这个finally总会执行的,比如在诸如打开文件、写数据到文件的操作失败的时候就可以进行关闭文件的操作。

五、With-as

我们在看其他人代码的时候,会看到这样的代码:with open(filename) as f 的样式。使用with语句的好处,就是到达语句末尾时,会自动关闭文件,这就不需要使用try-except的方式捕捉异常进行关闭文件的操作了。

如果直接使用open()方法打开文件,如果出现异常,如读取过程中文件不存在或异常,则直接出现错误,close方法无法执行,文件无法关闭的,我们来看看使用with open…的方式:

def open_file(filename):try:with open(filename) as f:file = open(filename)print('文件名:',file.name)except OSError as E:print('open file error')
filename = r'C:\Users\TEN\Desktop\1.txt'
open_file(filename)

六、异常类的定义

在实际的工程项目中,我们有时候需要定义一个区别于系统的异常类,还好python提供了一个可以自己定义异常类的方法,我们来看下面的代码:

# 自定义异常类,继承于Exception基类
class Division_Error(Exception):# 当输出有误时,抛出此异常# 初始化def __init__(self, value, name):self.value = valueself.name = name# 返回异常类对象的相关信息def __str__(self):if self.value % 2 != 0 and len(self.name) < 5:return ("{}不是偶数,{}长度小于4".format(self.value,self.name) )
try:# 抛出异常print('尝试显示抛出异常')diverr = Division_Error(1,'name')raise diverr#或raise Division_Error(1,'name')'
except Division_Error as diverr:print('diverr: {}'.format(diverr))

上述代码中自定了一个继承于基类的Division_Error类,用于抛出一些异常,在try的代码块中,我们使用raise用于显示的抛出异常。

七、总结

上述就是Python中异常处理的相关知识了,介绍了python中几个异常的类型以及使用小例子具体介绍了他们的用法,接着我们介绍了异常的处理方法,这些方法在实际的项目中都非常的实用,小伙伴们可以参考其中的一些介绍进行实际的操作。

这篇关于Python实用教程系列——异常处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/851667

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

nudepy,一个有趣的 Python 库!

更多资料获取 📚 个人网站:ipengtao.com 大家好,今天为大家分享一个有趣的 Python 库 - nudepy。 Github地址:https://github.com/hhatto/nude.py 在图像处理和计算机视觉应用中,检测图像中的不适当内容(例如裸露图像)是一个重要的任务。nudepy 是一个基于 Python 的库,专门用于检测图像中的不适当内容。该

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip