初始Python篇(8)—— 异常

找往期文章包括但不限于本期文章中不懂的知识点:

个人主页:我要学编程(ಥ_ಥ)-CSDN博客

所属专栏: Python

目录

异常介绍

异常的处理

try-except 

try-except-else 

try-except-else-finally

异常的抛出 

常见的异常类型


 

异常介绍

在学习异常之前,先了解bug的概念。简单理解就是程序运行不起来或者运行起来之后,输出的结果不符合我们的预期。有了bug肯定是要去解决的。而解决bug就离不开异常的处理。

如果是程序运行出错,有两种情况:1、程序本身就存在问题;2、对于存在输入型程序来说,可能是用户的输入导致程序报错。

第一种情况,就需要我们自己去排查,看是哪里出现了语法错误。

第二种情况,就需要用到我们今天学习的异常处理。

如果是程序运行之后,结果不符合我们的预期,这就需要用到调试工具了。

异常的处理

try-except 

Python中对于异常的处理是通过 try-except 语句来捕获异常的。

语法:

try:
    ... // 可能出现异常的代码
except 异常类型A:
    ... // 处理异常的代码(程序报错之后执行的代码)
except 异常类型B:
    ... // 处理异常的代码(程序报错之后执行的代码)

代码演示: 

try:
    num1 = int(input('请输入一个数:'))
    num2 = int(input('请输入一个数:'))
    print('{0} / {1}的结果是:{2}'.format(num1, num2, num1//num2)) # // 这是整数除法
except ZeroDivisionError:
    print('除数为0异常')

上面只是一种情况,还会出现其他的异常输入。

从上面的结果,我们可以看出:程序抛出异常之后,就不会继续执行下去了,要么去执行捕获异常之后的代码,要么直接就摆烂了。 

处理异常:

except ValueError:
    print('请输入一个合法的整数')

因此,当我们以后遇到异常之后,即使不知道是啥异常,但只要我们将异常给捕获了,程序就不会直接结束,而是会执行 except 语句代码。 

try-except-else 

除此之外,Python还提供了类似 while-else的语句。当程序将try中的代码全部执行完毕之后(意味着不存在异常),就会去执行 else 语句。

语法:

try:
    ... // 可能出现异常的代码
except 异常类型A:
    ... // 处理异常的代码(程序报错之后执行的代码)
except 异常类型B:
    ... // 处理异常的代码(程序报错之后执行的代码)

....... // 剩余异常

else:
    ... // 程序没有异常将会执行的代码

代码演示:

try:
    num1 = int(input('请输入一个数:'))
    num2 = int(input('请输入一个数:'))
    print('{0} / {1}的结果是:{2}'.format(num1, num2, num1//num2)) # // 这是整数除法
except ZeroDivisionError:
    print('除数为0异常')
except ValueError:
    print('请输入一个合法的整数')
else:
    print('程序执行完毕')

运行结果:

else 语句中的代码主要是 用来区分 程序无异常时,将会执行的代码。因此我们可以将计算的结果放到else语句中去输出。

代码演示:

try:
    num1 = int(input('请输入一个数:'))
    num2 = int(input('请输入一个数:'))
    result = num1 // num2
except ZeroDivisionError:
    print('除数为0异常')
except ValueError:
    print('请输入一个合法的整数')
else:
    print('{0} / {1}的结果是:{2}'.format(num1, num2, result))
    print('程序执行完毕')

这可以增加代码整体布局的美观性。

try-except-else-finally

当程序抛出异常之后,try语句中剩余的代码并不会执行了,那如果剩余的代码中,有一些逻辑是为了安全性考虑的呢,这如果不执行的话,那就会导致程序存在安全问题。如果要执行的话,该怎么办呢?将一些重要逻辑代码全部放到except中,每一个语句都放一份,这样的确可行,但是太过冗余了。因此,便有了 finally 语句:无论程序是否抛出异常,其中的代码都会执行。

语法:

try:
    ... // 可能出现异常的代码
except 异常类型A:
    ... // 处理异常的代码(程序报错之后执行的代码)
except 异常类型B:
    ... // 处理异常的代码(程序报错之后执行的代码)

....... // 剩余异常

else:
    ... // 程序没有异常将会执行的代码
finally:
    ... // 无论程序是否抛出异常都会被执行

代码演示:

try:
    num1 = int(input('请输入一个数:'))
    num2 = int(input('请输入一个数:'))
    result = num1 // num2
except ZeroDivisionError:
    print('除数为0异常')
except ValueError:
    print('请输入一个合法的整数')
else:
    print('{0} / {1}的结果是:{2}'.format(num1, num2, result))
    print('程序执行完毕')
finally:
    print('I love coding')

运行结果:

修改后的结果: 

异常的抛出 

一个程序需要用户某些值时,但是用户输入的值又不符合我们的要求,针对这种情况就可以去让程序手动抛出异常。 这个异常是通过 raise 关键字来抛出的。

语法:

raise [Exception类型(异常描述信息)]

 代码演示:

try:
    num = int(input('请输入一个1-100之间的整数:'))
    if num >= 1 and num <= 100:
        print(f'你输入的数字是:{num}')
    else:
        raise Exception('不符合程序要求')
except ValueError:
    print('请输入一个整数')
# e这里是作为异常对象,如果我们去打印Exception时打不出其中的异常信息
# 需要用到 as 别名 的语法,然后去打印e这个对象,就可以将异常信息大于出来
except Exception as e:
    print(e)

运行结果:

因为 ValueError 这是Python内置的异常类,当其中的异常信息已经被填充了,所以这就无需我们手动填充,并且也不需要我们去起别名。

注意:

1、在使用 raise 关键字抛异常时,这个异常可以是内置的异常,也可以是我们自己构造出来的异常。但我们在使用自己构造的异常时,最好还是去描述异常的详细信息,以便于后续排查。

2、在except 语句中,去捕获异常时,是从上到下依次判断的,也就是先是判断异常是否为 ValueError,再去判断是否为 Exception。由于 ValueError 是 Exception 的子类,如果当 Exception 写在前面先判断时,就会出现无论是什么样的异常都会被Exception给捕获,从而导致异常被错误的处理了。这里的"子类"、"父类"等概念先不用管,后面学习类和对象就明白了。

3、我们如果先想要打印出描述异常的详细信息,就需要给异常起一个别名,然后通过别名去打印出来。

常见的异常类型

异常类型描述类型
ZeroDivisionError当除数为0时,所引发的异常
IndexError索引超出范围所引发的异常
KeyError字典取值时,key不存在所引发的异常
NameError使用未声明的变量时,所引发的异常
SyntaxError语法错误(一般,编译器能识别出来)
ValueError传入的值错误
AttributeError访问对象的属性或者方法不存在所引发的异常
TypeError类型不合适所引发的异常
IndentationError不正确的缩进所引发的异常

下面我们对上述涉及的异常来演示一下:

# ZeroDivisionError
# print(10 / 0)

# IndexError
# lst = [1,2]
# print(lst[3])

# KeyError
# 只有以下两种方式触发:KeyError
# d = {'张三':18, '李四':20}
# d.pop('小军')
# print(d['小明'])

# NameError
# print(name, age)

# SyntaxError
# 学过C语言的同学,刚接触可能会犯这样的错误
# for (int i = 0; i < 10; i++) {
#     printf("%d", i);
# }

# ValueError
# age = int('18.5')

# TypeError
# print('12'+12)

# IndentationError
# if 1 == 1:
# print(1)

由于我们还没有学习 类和对象,因此这里的 AttributeError 不是很好演示。等后面我们学习了类和对象之后,再去尝试就行了。

好啦!本期 初始Python篇(8)—— 异常 的学习之旅 就到此结束啦!我们下一期再一起学习吧!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SSM-MyBatis-总结

文章目录 一、Hello MyBatis1.1 流程1.2 总结 二、Crud 的一些注意点三、参数传递3.1 #{ } VS ${ }3.2 单、复参数传递&#xff08;1&#xff09;单参数&#xff08;2&#xff09;多参数 -- Param&#xff08;3&#xff09;总结 四、查询结果返回--结果封装4.1 ResultType 一般…

【算法设计与分析】实验1:字符串匹配问题的算法设计与求解

目录 一、实验目的 二、实验环境 三、实验内容 四、核心代码 五、记录与处理 六、思考与总结 七、完整报告和成果文件提取链接 一、实验目的 给定一个文本&#xff0c;在该文本中查找并定位任意给定字符串。 1、深刻理解并掌握蛮力法的设计思想&#xff1b; 2、提高应用…

10.6.1 文本文件读、写和追加

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 文本文件的读写通常的做法是建立一个与文件关联的filestream&#xff0c;然后使用StreamReader读取或者StreamWriter写入。 为了详…

DevEco Studio 4.1中如何创建OpenHarmony的Native C++ (NAPI)程序

目录 引言 操作步骤 结语 引言 OpenHarmony的开发工具变化很快&#xff0c;有的时候你安装以前的教程进行操作时会发现界面和操作方式都变了&#xff0c;进行不下去了。比如要在OpenHarmony中通过NAPI调用C程序&#xff0c;很多博文&#xff08;如NAPI篇【1】——如何创建含…

达梦拷贝DM_HOME的复制安装

近期一个项目需求&#xff0c;需要在没有安装包的情况下&#xff0c;将达梦数据库安装到虚机上&#xff08;生产机上安装了达梦&#xff09;&#xff0c;故采用直接打包生产机DM_HOME的方式拷贝至虚机&#xff0c;再依次执行达梦的部分指令完成安装。以下为验证的步骤&#xff…

【MySQL】初始MySQL、库与表的操作

目录 基本使用 使用案例 SQL分类 存储引擎 库的操作 字符集和校验规则 查看系统默认字符集和校验规则 查看数据库支持的字符集 查看数据库支持的字符集校验规则 指定编码常见数据库 校验规则对数据库的影响 操纵数据库 库的备份与恢复 表的操作 创建表 查看表 …

AI大模型开发原理篇-2:语言模型雏形之词袋模型

基本概念 词袋模型&#xff08;Bag of Words&#xff0c;简称 BOW&#xff09;是自然语言处理和信息检索等领域中一种简单而常用的文本表示方法&#xff0c;它将文本看作是一组单词的集合&#xff0c;并忽略文本中的语法、词序等信息&#xff0c;仅关注每个词的出现频率。 文本…

“爱”之浅谈(一)

《九重紫》里 陈嘉有了爱情 从粗糙的一介武夫和赌徒&#xff0c;变得温柔细致 万皇后伤于爱情 从温柔的眼里有爱有光的小姑娘&#xff0c;变成狠毒的残害忠良的、意图谋反的、卷动举国风云的操盘手 “爱让怯懦者勇敢&#xff0c;让高傲者低头” “爱是软肋&#xff0c;也是…

图漾相机搭配VisionPro使用简易教程

文章目录 1.下载并安装VisionPro软件2.下载PercipioCameraForVisionPro软件包3.软件部署4.测试流程4.1 遍历VisionPro SDK支持的参数4.2 设置示例4.2.1_cameraSingle.SetTriggerMode4.2.2 _cameraSingle.SetRegistration4.2.3_cameraSingle.SetInt4.2.4 _cameraSingle.GetInt4.…

Versal - 基础3(AXI NoC 专题+仿真+QoS)

目录 1. 简介 2. 示例 2.1 示例说明 2.2 创建项目 2.2.1 平台信息 2.2.2 AXI NoC Automation 2.2.3 创建时钟和复位 2.3 配置 NoC 2.4 配置 AXI Traffic 2.5 配置 Memory Size 2.6 Validate BD 2.7 添加观察信号 2.8 运行仿真 2.9 查看结果 2.9.1 整体波形 2.9…

iperf 测 TCP 和 UDP 网络吞吐量

注&#xff1a;本文为 “iperf 测网络吞吐量” 相关文章合辑。 未整理去重。 使用 iperf3 监测网络吞吐量 Tom 王 2019-12-21 22:23:52 一 iperf3 介绍 (1.1) iperf3 是一个网络带宽测试工具&#xff0c;iperf3 可以擦拭 TCP 和 UDP 带宽质量。iperf3 可以测量最大 TCP 带宽…

ResNeSt: Split-Attention Networks论文学习笔记

这张图展示了一个名为“Split-Attention”的神经网络结构&#xff0c;该结构在一个基数组&#xff08;cardinal group&#xff09;内进行操作。基数组通常指的是在神经网络中处理的一组特征或通道。图中展示了如何通过一系列操作来实现对输入特征的注意力机制。 以下是图中各部…

自动驾驶---苏箐对智驾产品的思考

1 前言 对于更高级别的自动驾驶&#xff0c;很多人都有不同的思考&#xff0c;方案也好&#xff0c;产品也罢。最近在圈内一位知名的自动驾驶专家苏箐发表了他自己对于自动驾驶未来的思考。 苏箐是地平线的副总裁兼首席架构师&#xff0c;同时也是高阶智能驾驶解决方案SuperDri…

【C++】内联函数inline、关键字auto与新式for

内联函数 内联函数背景 我们在使用C语言中我们都学过函数&#xff0c;我们知道函数在调用的过程中需要开辟栈帧。如果我们需要频繁的调用一个函数&#xff0c;假设我们调用10次Add()函数&#xff0c;那我们就需要建立10次栈帧。我们都知道在栈帧中要做很多事情&#xff0c;例如…

Day24-【13003】短文,数据结构与算法开篇,什么是数据元素?数据结构有哪些类型?什么是抽象类型?

文章目录 13003数据结构与算法全书框架考试题型的分值分布如何&#xff1f; 本次内容概述绪论第一节概览什么是数据、数据元素&#xff0c;数据项&#xff0c;数据项的值&#xff1f;什么是数据结构&#xff1f;分哪两种集合形式&#xff08;逻辑和存储&#xff09;&#xff1f…

论文阅读(十六):利用线性链条件随机场模型检测阵列比较基因组杂交数据的拷贝数变异

1.论文链接&#xff1a;Detection of Copy Number Variations from Array Comparative Genomic Hybridization Data Using Linear-chain Conditional Random Field Models 摘要&#xff1a; 拷贝数变异&#xff08;CNV&#xff09;约占人类基因组的12%。除了CNVs在癌症发展中的…

深入理解若依RuoYi-Vue数据字典设计与实现

深入理解若依数据字典设计与实现 一、Vue2版本主要文件目录 组件目录src/components&#xff1a;数据字典组件、字典标签组件 工具目录src/utils&#xff1a;字典工具类 store目录src/store&#xff1a;字典数据 main.js&#xff1a;字典数据初始化 页面使用字典例子&#xf…

思维练习题

目录 第一章 假设法1.题目1. 如何问问题2. 他们的职业是分别什么3. 谁做对了4. 鞋子的颜色 2.答案 空闲时间写一些思维题来锻炼下思维逻辑&#xff08;题目均收集自网上&#xff0c;分析推理为自己所写&#xff09;。 第一章 假设法 一个真实的假设往往可以让事实呈现眼前&…

亲测有效!解决PyCharm下PyEMD安装报错 ModuleNotFoundError: No module named ‘PyEMD‘

解决PyCharm下PyEMD安装报错 PyEMD安装报错解决方案 PyEMD安装报错 PyCharm下通过右键自动安装PyEMD后运行报错ModuleNotFoundError: No module named ‘PyEMD’ 解决方案 通过PyCharm IDE python package搜索EMD-signal&#xff0c;选择版本后点击“install”执行安装

DVC - 数据版本和机器学习实验的命令行工具和 VS Code 扩展

文章目录 一、关于 DVC二、快速启动三、DVC的工作原理四、VS代码扩展五、安装Snapcraft&#xff08;Linux&#xff09;Chocolatey (Windows)Brew (mac OS)Anaconda (Any platform)PyPI&#xff08;Python&#xff09;Package (Platform-specific)Ubuntu / Debian (deb)Fedora /…