python异常处理_Python入门 断言与异常处理

一、断言

断言,可以理解为判断是否断开的预言。

assert  表达式 , 描述

表达式为我们的预期结果,当表达式的结果为False时,抛出 AssertionError 异常,如无异常捕获程序遇到异常时直接结束运行。反之,表达式结果为True 程序继续向下运行。

我们何时使用断言?

断言需要慎用,尤其是写测试用例或者程序时,因为我们运行程序时,如果断言失败,无异常捕获程序则会结束运行,导致后面的代码无法执行。

断言一般用在防御型的编程、运行时检查程序逻辑、检查约定、程序常量、检查文档时,在从来不会运行失败的代码不必要加上断言。

示例1.1:当pi值对修改抛出异常

class 

输出结果:

Traceback (most recent call last):assert self.pi == Circle.pi, 'pi 值被修改'
AssertionError: pi 值被修改

示例1.2:

assert 

二、语法错误与异常的区别

语法错误:或者称之为解析错,程序无法解析或者编译

1、语法错误:代码不符合解释器或编译器的语法,如:print()输出单词出错

2、逻辑错误:不完成或者不合法的输入或者计算机出问题,如:死循环

异常:执行过程中出现问题导致程序无法执行

1、程序遇到逻辑或者算法问题,如:1/0

2、运行过程中计算机错误,如:内存不够或者IO错误

异常出现的过程:

1、异常产生,检查到错误且解释器认为是异常,抛出异常

2、异常处理,截获异常,忽略或者终止程序处理异常

总结:异常都可以是错误,但是错误不一定是异常

三、异常

运行期间检测到的错误被称为异常,大多数的异常都不会被程序处理,都以错误信息的形式展现。

如下:

>>>1/0
Traceback (most recent call last):File "<input>", line 1, in <module>
ZeroDivisionError: division by zero
>>>4+a*5
Traceback (most recent call last):File "<input>", line 1, in <module>
NameError: name 'a' is not defined
>>>'2'+2
Traceback (most recent call last):File "<input>", line 1, in <module>
TypeError: Can't convert 'int' object to str implicitly

异常以不同的类型出现,这些类型都作为信息的一部分打印出来。如上面例子中的类型有ZeroDivisionError,NameError 和 TypeError异常。

错误信息的前面部分显示了异常发生的上下文,并以调用栈的形式显示具体信息。

Python中常见的异常

37d3697e3d799971f18003df9e08b53e.png
常见异常

四、异常处理 try...except...else...finally...

怎么捕获异常,并处理?

我们捕获异常使用 try ... except ...,try 与 except 之间是可能会发生异常的语句块,而 except 下的语句块是当异常发生后我们进行处理的语句块。

示例 4.1:

while 

运行程序:

接收一个除数:1
2.0
接收一个除数:0
发生了异常
接收一个除数:2a
发生了异常

如上,当我们输入0发生了异常,输入2a也发生了异常,因为int()无法将2a转换为int,而且两种异常类类型不同。

怎么捕获特定的异常?

在 except 后加入异常类型,就可以捕获特定的异常,也可以一次性捕获多个异常,如下示例4.2

示例4.2:

while 

运行程序:

接收一个除数:0
发生了ZeroDivisionError异常
接收一个除数:a
发生了ValueError或KeyboardInterrupt或TypeError异常

except 后语句只在发生异常后才执行,那么有没有当异常没有发生时我们才进行处理的语句?

有,try ... except ... else ...,else 后的语句块是当异常没有发生后才会执行。

示例4.3:

while 

运行程序:

接收一个除数:0
发生了ZeroDivisionError异常
接收一个除数:1
2.0
结束程序运行

如上运行结果,else只有在没有发生异常的时候运行。

异常发生可以处理,异常没发生也可以处理,那么有没有不管是否发生异常都进行处理的语句?

有try ... except ... finally ...,finally 下的语句块不管有没有发生异常都会执行。

示例4.4:

while 

运行程序:

接收一个除数:1
2.0
执行了finally语句块
接收一个除数:0
发生了ZeroDivisionError异常
执行了finally语句块

如上 finally 下的语句块,不管有没有出现异常都会执行。

try ... except ... else ... finally ... 的使用顺序

try ... except ... else ... finally...使用顺序,else 必须在 except 后 finally 前,finally 只能在最后;else 与 finally 可有可无。

语法上 except 也可以缺少,不过少了except就不能捕获异常,没人会这样写代码。

try

五、抛出异常 raise

Python 可以使用 raise 语句抛出一个指定的异常

raise 

raise 唯一的一个参数是指定要被抛出的异常。它必须是一个异常的实例或者是异常的类(也就是 Exception 的子类)。

示例:

raise 

输出结果:

Traceback (most recent call last):raise NameError('使用一个还未赋值对象的变量')
NameError: 使用一个还未赋值对象的变量

try ... except ... finally ... 使用场景

try ... except ... finally ... 是非常常用,主要用于如关闭数据库连接,文件关闭,释放线程锁等。

fo 

附件:异常类列表

来自官方文档:5. Built-in Exceptions

BaseException+-- SystemExit+-- KeyboardInterrupt+-- GeneratorExit+-- Exception+-- StopIteration+-- StopAsyncIteration+-- ArithmeticError|    +-- FloatingPointError|    +-- OverflowError|    +-- ZeroDivisionError+-- AssertionError+-- AttributeError+-- BufferError+-- EOFError+-- ImportError+-- ModuleNotFoundError+-- LookupError|    +-- IndexError|    +-- KeyError+-- MemoryError+-- NameError|    +-- UnboundLocalError+-- OSError|    +-- BlockingIOError|    +-- ChildProcessError|    +-- ConnectionError|    |    +-- BrokenPipeError|    |    +-- ConnectionAbortedError|    |    +-- ConnectionRefusedError|    |    +-- ConnectionResetError|    +-- FileExistsError|    +-- FileNotFoundError|    +-- InterruptedError|    +-- IsADirectoryError|    +-- NotADirectoryError|    +-- PermissionError|    +-- ProcessLookupError|    +-- TimeoutError+-- ReferenceError+-- RuntimeError|    +-- NotImplementedError|    +-- RecursionError+-- SyntaxError|    +-- IndentationError|         +-- TabError+-- SystemError+-- TypeError+-- ValueError|    +-- UnicodeError|         +-- UnicodeDecodeError|         +-- UnicodeEncodeError|         +-- UnicodeTranslateError+-- Warning+-- DeprecationWarning+-- PendingDeprecationWarning+-- RuntimeWarning+-- SyntaxWarning+-- UserWarning+-- FutureWarning+-- ImportWarning+-- UnicodeWarning+-- BytesWarning+-- ResourceWarning

2020年4月16日,第一次更新,优化内容

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

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

相关文章

C++ 左值和右值 的学习

引用是一个变量&#xff0c;它引用其他变量的内存位置 int x 34; int &lRef x; 标识符 IRef 就是一个引用。在声明中&#xff0c;引用是通过 & 来指示的&#xff0c;出现在类型与变量的标识符之间&#xff0c;这种类型的引用称为左值引用左值看作是一个关联了名称的…

百度关键词排名查询源码_章丘百度霸屏总部,关键词排名腾沃云

上海保沃腾沃云为您详细解读URiIr章丘百度霸屏总部的相关知识与详情&#xff0c;做网站SEO优化文章内容优化效果已经十分明显。内容的量量关于网站的整体量量很重要。通过关键字阐发&#xff0c;陈某们晓得需要环绕关键字编写网页。使您的内容的重要根底是您对网页筹算描述的卖…

java 结婚问题

题目 大家都知道&#xff0c;男大当婚&#xff0c;女大当嫁。那么女方家长要嫁女儿&#xff0c;当然要提出 一定的条件&#xff1a;高&#xff1a;180cm以上&#xff1b;富&#xff1a;财富1千万以上&#xff1b;帅&#xff1a;是。 如果这三个条件同时满足&#xff0c;则&…

密码学专题 数据填充的方式|序列加密的方式

电子密码本模式和加密分组链接模式的分组算法都要求加密输入的分组是固定长度 的&#xff0c;但是大多数输入明文可能都不是分组长度的整数倍&#xff0c;也就是说&#xff0c;最后一个分组一般来 说是不足一个分组长度的。为了使分组加密算法能够正常工作&#xff0c;通常使用…

win10此电脑不见了_教程 | win10总提示“你要允许此应用对电脑的修改吗”,如何关闭?...

在使用电脑的时候&#xff0c;你是否曾遇到过这样的情况&#xff0c;点击打开软件的时候&#xff0c;系统总是提示我们“你要允许此应用对你的设备进行修改吗&#xff1f;”难道是软件中病毒了吗&#xff1f;&#xff0c;这其实上并没有什么用处&#xff0c;只是系统无法判断软…

java 小时转换为xx天xx小时

题目 为抵抗洪水&#xff0c;战士连续作战89小时&#xff0c;编程计算共多少天零多少小时&#xff1f; 代码 使用/与% class ExchangeTime {public static void main(String[] args) {/*为抵抗洪水&#xff0c;战士连续作战89小时&#xff0c;编程计算共多少天零多少小时&a…

密码学专题 加密模式的选择|传输数据加密

分组加密模式和序列加密模式。它们之间最大的区 别在于分组加密模式每次对一组数据进行加密运算处理&#xff0c;而序列加密模式则逐位对数据进 行加密运算处理。事实上&#xff0c;在实际设计应用的算法中&#xff0c;并没有那么严格的区别&#xff0c;它们有可能是相互结合的…

微信公众号数据2019_2019年9月原创公众号排行榜数据报告出炉

西瓜数据发布 2019 年 9 月原创公众号排行榜&#xff0c;分别从西瓜指数、原创文章占比、周期内公众号发文次数、发文篇数、总阅读数、头条平均阅读数等方面展示公众号数据。榜单说明1、涉及榜单本期月榜截取 ①财经、②教育、③娱乐、④科技、⑤体育、⑥游戏、⑦文化、⑧美食、…

java 求100天之后是周几

题目 今天是周二&#xff0c;100天以后是周几&#xff1f; 代码 代码1&#xff1a;减去天数&#xff0c;使循环从周一开始 //方法1&#xff1a;减去天数&#xff0c;使循环从周一开始int today2;//7天一个循环&#xff1a;3 4 5 6 7 1 2 3 4 5 6 7int after100;//(100-5)%…

密码学专题 OpenSSL专题

OpenSSL总体架构 软件包分为三个主要的功能部分&#xff1a;密码算法库 、 SSL协议库及应用程序 MacOS&#xff0c;MS&#xff0c;OS/2及 VMS这几个目录&#xff0c;包含了在不同的 平台编译时的环境变量配置文件&#xff0c;在安装编译完成之后&#xff0c;这几个目录就没有作…

java 华氏温度转换为摄氏温度

题目 小明要到美国旅游&#xff0c;可是那里的温度是以华氏度为单位记录的。 它需要一个程序将华氏温度&#xff08;80度&#xff09;转换为摄氏度&#xff0c;并以华氏度和摄氏度为单位分别显示该温度。 公式&#xff1a;华氏温度&#xff08;摄氏温度-32&#xff09;/1.8 M…

hs控什么意思_凡尔赛文学 到底是什么?

点击蓝字关注我们XIE XIE NI DE XI HUAN|| 动漫 情头 耽美 闺蜜 男女头 句子控 壁纸 ||左句 凡尔赛文学野象&#xff1a;老是有人提知不知道凡尔赛文学&#xff0c;说实话我不太清楚网络时下流行的梗&#xff0c;也没有兴趣参与&#xff0c;我还是比较喜欢欧洲古典文学和后现…

密码学专题 openssl编译和安装

Configure 脚本文件 使得OpenSSL可以适应多种不同的系统平台和多达几十种不同的编译器。Configure指令还可以使OpenSSL在编译的时候具备组件的选择功能&#xff0c;比如可以选择支持或者不支持某种算法或者协议等&#xff0c;这使得OpenSSL具有很大的灵活性&#xff0c;比如在…

Python学习12 文件的读写

目标 文件的打开和关闭 mode缺省情况下表示只读r 文件的路径 前面加个r’,代表其中的转义字符不起作用 文件的打开方式 案例&#xff1a;实现文件拷贝的功能 将某一文件夹下的某一文件 保存在当前文件 所在目录。 import os #读取文件1 path./file.txt fileopen(path,…

密码学专题 openssl的基本概念

配置文件 配置文件是OpenSSL的一个基础结构组件&#xff0c;OpenSSL使用一组称为OpenSSLCONF的函数来读取OpenSSL配置文件的信息。OpenSSL提供的主配置文件是opensl.cnf&#xff0c;它集成了OpenSSL所要使用的配置文件选项的大部分内容。此外&#xff0c;OpenSSL还提供了其他一…

该工程中的宏被禁止_建筑劳务分包都能承担什么工程

来源&#xff1a;找法网建筑工程的承包单位&#xff0c;也就是总承包单位可以将部分建造工程分包给具有资质的施工单位&#xff0c;这是法律所允许的&#xff0c;但是禁止将建造工程进行转包。一、建筑劳务分包都能承担什么工程建筑劳务分包能承担什么工程要看分包单位的资质&a…

python实验练习-类的多继承

题目 1、概述&#xff1a; 完成学生&#xff0c;组长&#xff0c;教师的设计与实现。 2、具体实现内容&#xff1a; 学生&#xff1a; 姓名&#xff0c; 年龄&#xff0c; 学号 吃饭&#xff0c; 睡觉&#xff0c; 学习 组长&#xff1a; 姓名&#xff0c; 年龄&#xff0c; 学…

matlab用辛普森公式求积分_积分近似计算之辛普森公式

对于积分区间[a, b]&#xff0c;若则成立辛普森公式辛普森公式可看作是改良的梯形公式。梯形公式是以直线逼近实际曲线&#xff0c;而辛普森公式则以二次曲线(即抛物线)逼近。以二次曲线逼近实际曲线根据辛普森公式可得各积分小区间内的积分值如下式所示&#xff1a;其中于是&a…

密码学专题 文件编码格式

OpenSSL中虽然使用PEM作为基本的文件编码格式&#xff0c;但是&#xff0c;由于不同的对象其封装的标准格式不太一样&#xff0c;所以经常会导致读者产生迷惑。此外&#xff0c;OpenSSL也支持DER编码和过时的Netscape编码格式(NET)OpenSSL的编码是基于ASN.1标准的&#xff0c;A…

python实验练习-图书管理系统(使用文件来实现)

题目 功能描述&#xff1a; 图书管理系统项目功能描述&#xff1a; &#xff08;1&#xff09;创建txt文本文档&#xff0c;包含如下&#xff1a; ① books.txt&#xff1a;保存有一些书籍名称&#xff1b; ② users.txt&#xff1a;用于保存用户相关的信息&#xff1b; ③ us…