异常—python

news/2024/9/23 15:33:01/

一、异常

当检测到一个错误时,Python解释器就无法继续执行了,反而出现了一些错误的提示,这就是异常, 也就是我们常说的BUG,那BUG是怎么由来的呢?

例如:

python">print(1/0)

我们在小学的时候就知道0不能作除数,运行这条代码,程序不仅无法执行还会报错,零除法错误就是一种异常。

二、异常处理

异常实际上就是一种错误,我们写程序出错误是一件很正常的事情,关键在于发现错误、解决错误。我们要做的,不是要求程序完美, 而是在力所能及的范围内,对可能出现的bug,进行提前准备、提前处理,这种行为叫做异常处理(捕获异常)。

在之前的学习中, 我们所有的程序遇到BUG就会出现整个程序因为一个BUG停止运行的情况, 也就是整个程序直接奔溃。但是在实际工作中, 我们不能因为一个小的BUG就让整个程序全部奔溃, 我们希望的是:对BUG进行提醒后整个程序继续运行。那我们就需要捕获异常:提前假设某处会出现异常,做好提前准备,当真的出现异常的时候,可以有相应的解决方案。

2.1捕获常规异常

语法:

try:    

     可能发生错误的代码

except:    

     如果出现异常执行的代码

我们在文件一节学习了open函数——http://t.csdnimg.cn/jVDYK

  • 用open函数以只读模式‘r’打开一个文件,如果文件不存在,运行后会报错。
  • 用open函数以写入模式‘w’打开一个文件,如果文件不存在,创建新文件进行写入。

假设我们不知道文件test.txt是否存在,我们把以只读模式打开test.txt作为可能发生错误的代码,把以写入模式打开test.txt作为如果出现异常执行的代码。

python">try:f = open('test.txt', 'r', encoding='UTF-8')print("文件test.txt存在")
except:f = open('test.txt', 'w', encoding='UTF-8')print("文件test.txt不存在,创建")

输出:

文件test.txt不存在,创建

2.2捕获指定异常

语法:

try:    

     可能发生错误的代码

except 错误种类 as e:    

     如果出现异常执行的代码

如果我们打印输出一个未定义的变量

python">print(ret)

运行起来会报错:

我们捕捉这种特定的异常NameError,代码如下:

python">try:print(ret)
except NameError as e:print("变量名称未定义错误")

输出:

变量名称未定义错误

我们再看另一个代码示例,捕捉这种特定的异常FileNotFoundError:

python">try:f = open('test.txt', 'r', encoding='UTF-8')
except FileNotFoundError as e:print("文件不存在错误")

输出:

文件不存在错误

如果尝试执行的代码的异常类型和要捕获的异常类型不一致,则无法捕获异常。

python">try:f = open('test.txt', 'r', encoding='UTF-8')
except NameError as e:print("文件不存在错误")

出现的代码异常是文件不存在错误,捕获的异常类型是变量名称未定义错误,两者不一致,无法捕捉,运行会报错。

2.3捕获多个异常

当捕获多个异常时,可以把要捕获的异常类型的名字,放到except 后,以元组的方式进行书写。

代码示例:

python">try:print(1/0)
except (NameError,FileNotFoundError,ZeroDivisionError) as e:print('变量名称未定义错误/文件不存在错误/零除法错误')

输出:

变量名称未定义错误/文件不存在错误/零除法错误

代码示例:

python">try:f = open('test.txt', 'r', encoding='UTF-8')
except (NameError,FileNotFoundError,ZeroDivisionError) as e:print('变量名称未定义错误/文件不存在错误/零除法错误')

输出:

变量名称未定义错误/文件不存在错误/零除法错误

代码示例:

python">try:print(ret)
except (NameError,FileNotFoundError,ZeroDivisionError) as e:print('变量名称未定义错误/文件不存在错误/零除法错误')

输出:

变量名称未定义错误/文件不存在错误/零除法错误

如何在捕获异常的同时准确地输出描述信息呢?

输出变量e即可,代码示例:

python">try:print(ret)
except (NameError,FileNotFoundError,ZeroDivisionError) as e:print(e)

输出:

name 'ret' is not defined

2.4捕获所有异常

捕获所有异常有两种方式,第一种就是捕获常规异常的方式,第二种如下所示:

语法:

try:    

     可能发生错误的代码

except Exception as e:  

     如果出现异常执行的代码

方式一:

python">try:print(ret)
except:print('errno')

输出:

errno

方式二:

python">try:print(ret)
except Exception as e:print(e)

输出:

name 'ret' is not defined

三、异常处理中的else与finally

3.1异常处理中的else

语法:

try:    

     可能发生错误的代码

except:  

     如果出现异常执行的代码

else:

     如果没有异常要执行的代码

代码示例:

python">try:print(5/1)
except:print('errno')
else:print('perfect')

输出:

5.0
perfect

3.2异常处理中的finally

语法:

try:    

     可能发生错误的代码

except:  

     如果出现异常执行的代码

finally:

     无论是否异常都要执行的代码

代码示例:

python">try:print(5/0)
except:print('errno')
finally:print('阳光总在风雨后')

输出:

errno
阳光总在风雨后

代码示例:

python">try:print(5/1)
except:print('errno')
else:print('perfect')
finally:print('阳光总在风雨后')

输出:

5.0
perfect
阳光总在风雨后

注意:异常处理中的else与finally都是可选的,可以写也可以不写。

四、异常的传递性

请先看这个函数多层调用的例子,然后结合图片进行理解:

python">def func1():ret=1/0print(ret)def func2():print('func2的开始')func1()print('func2的结束')def main():try:func2()except Exception as e:print(e)main()

输出:

func2的开始
division by zero

异常随着函数的传递而传递。


http://www.ppmy.cn/news/1515349.html

相关文章

Java---面向对象

一.面向对象 1.概念 1.1面向过程 C 吃饭:动作为核心 起身--》开门--》大量的逻辑判断 1.2面向对象 C/Java/Python/Go 目标:吃饭 人(忽略)吃饭 站在人类的角度思考问题 2.什么是对象? Object-->东西(万事万物皆…

Vue3重置reactive变量造成循环引用导致JSON.stringify语法报错

问题背景 初始化定义变量 const myForm reactive({...}); 给reactive变量整体赋值代码如下 myForm.value Object.assign(myForm, {...}); 报错的代码 JSON.stringify(myForm); 解决方法 整体赋值时去掉前面的 “ myForm.value ”部分,直接调用Object.ass…

Dotnet Core-关于8.0版本中jwt的官方bug

Dotnet Core-关于8.0版本中jwt的官方bug 缘起Bug本体解决方案补充 缘起 自从诞生了互联网,网络安全一直是一个没有硝烟的战场。身份验证的实现已经在历代大佬的带领下更换了很多版本。JWT是目前比较常见的身份验证机制之一。 时间有限,今天就简单的记录…

PyTorch数据子集采样精粹:torch.utils.data.Subset深度解析

标题:PyTorch数据子集采样精粹:torch.utils.data.Subset深度解析 在深度学习项目中,对数据集进行有效的子集采样是常见需求,无论是为了创建训练集和测试集,还是进行K折交叉验证。PyTorch的torch.utils.data.Subset工具…

趣味算法------尾部零的个数(C语言,python双重解法)

目录 题目描述&#xff1a; 解题思路&#xff1a; 具体代码&#xff1a; 注意&#xff1a; 题目描述&#xff1a; 给出数字 n(0<n<1000000)&#xff0c;计算出 n 阶乘尾部零的个数。 输入输出格式 输入格式 一个整数。 输出格式 一个整数。 输入输出样例 输入 11 输…

基于微信小程序靓丽内蒙古APP(源码+定制+辅导)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

springboot admin监控

服务端搭建 maven的依赖&#xff0c;包括服务端和客户端&#xff0c;以及注册到nacos上面 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XML…

8.购物车清单

购物车清单 一、后端1.1创建ShoppingCart类1.2创建CartServlet类 二、前端2.1轻组件引入&#xff0c;函数引入2.2创建getList函数 &#xff0c;获取后端数据 一、后端 1.1创建ShoppingCart类 创建ShoppingCart类封装购物车信息&#xff0c;用来存放从数据库查询出来的数据。 …