当前课程知识点:计算思维与人工智能基础 > 第三部分:python基础 > 第五章:程序控制结构 > 5.5异常处理
大家好
我们下面给大家介绍Python的异常处理
任何程序在运行中都可能产生错误
和大多数计算机语言一样
Python在无法正常处理程序时呢
就会发生一个异常
异常呢就是一个Python的对象
表示一个错误及错误触发异常
异常就是我们程序运行时候发生错误的信号
在程序出现错误的时候呢会产生一个异常
若程序没有处理他呢
则会抛出该异常
程序的运行也随之结束
Python中有两种错误很容易辨认
一个是语法错误
另一个就是异常
我们首先来看一下这些语法错误
那么语法错误其实是过不了Python解释器的语法检测的
在程序执行前呢
就会被检测出来
首先检测语法错误
然后呢再检测逻辑错误
那么在Python解释器的是这样子
我们来看如果你写了个if
忘写条件或者写完条件忘写了冒号
那么这个都是什么呀
语法错误啊
他在执行的时候都会给大家检查出来
或者print没有写另外一个括号
那么也会写出来语法错误
另外一种错误就是逻辑错误
逻辑错误呢是在代码中呢他会抛出一个异常
比如说for i in 3
那么这个代码这段代码在执行的时候
他就抛出一个类型的异常
因为呢
3是一个整型类型的这个对象
他是不可以迭代的
或者说我们看下面这段代码会有一个错误
抛出来一个什么值的错误
如果我们输入的这个input的这个值
给了一个字符串的类型的话
他不能够正常转换为整形
所以他会抛出一个异常
值的错误的异常
另外的话
我们像if x大于3
print(x)
那这段代码里面呢
如果x之前是没有给赋值的
那这时候呢
x这个变量是没有定义的
会报出一个什么命名的一个错误
下面这是一个
索引的错误
定义了一个列表
那么列表的下标是0,1
但是你要访问下标为3的这个列表里的元素
它报出什么啊
下标越界啊
还有一个呢
我们常出现的就是我的除0的这个错误
如果是除法的时候
除数是0的时候呢
他会去报一个错误就是除数为0的这样的错误
在Python中的我们常见的一些异常有
属性的这个异常
那他主要的含义就是试图访问一个对象没有的属性
比如说我们foo.x
但是foo其实个对象是没有这个x这个属性的
IOError是输入输出异常
常出现的错误就是提示无法打开这个文件
另外一个是Import 异常
无法引入模块或者包就是导入的路径的问题
或者是名称的错误
IndentationError就是我们的语法的错误
其实这个就是我们缩进有问题
另外就是我们刚才说的这个IndexError
就是把下标越界啊
这是
还有一个KeyError就是试图访问字典里不存在的键
NameError使用一个未被赋值对象的一个变量
SyntaxError就是把代码非法
就是代码不能编译啊
通常是语法错误
TypeError就是我们类型错误
传入对象的类型与要求的不符合
UnboundLocalError是试图访问一个还未被设置的局部的变量
那么这个情况就是你已经有了一个同名的全局变量在用啊
那你在用当成局部变量去用的时候就会发生这样的错误
ValueError是传入一个调用者不期望的值
即使值的类型是正确的
那么这个传入的类型正确
那也可能会发生什么ValueError
异常处理
Python中的异常处理是Python解释器检测到错误
触发异常
程序员编写特定的代码
专门用来捕获这个异常
如果捕获成功
则进入另外一个处理分支
执行为其定制的逻辑使程序不会崩溃
这就是异常处理的过程
可预知的异常处理
如果错误发生的条件是可预知的
我们需要用if语句进行处理
在错误发生之前进行预防
我们来看下面这段代码
这段代码是一个猜数字的游戏
如果猜中就跳出
所以我们知道的预知的条件就是我们输入的这个字符串
是数字组成的呢
我们就把它进行转换
然后进行判断
如果非数字的
我们就通过我while true循环呢
让他跳过跳过循环过
是这样的一个过程
我们来看一下
在这jupyter下这段代码的执行过程
那我们执行这段代码
我们首先输入一个字符串啊
那我们可以看他执行后
他不会报错啊
没有猜中
那我们在再输一个数字的也没有猜中
直到我们猜中
那么这段代码跳出结束啊
这就是我们可预知异常的处理
那大部分情况的我们的异常是不可预知的
那么如果发生的条件是不可预知的
我们这时候就可以用try...except
那在错误发生之后进行处理
那么它的语法结构就是
try
被检测的代码块
except检测异常类型
那么满足这个except的异常类型那么就执行啊
之后为其制定的代码段
我们来看右边这段代码
我们通过try来检测这个print的语句能不能够正常输出
那如果检测出他的异常
那就是类型错误的时候
就输出这段文字
类型不同不能相加
那么给的这个a如果是一个字符类型的话
那他就会检测出来是错误的啊
就发生异常啊
如果我们给的是一个正常的
a是7的时候呢
他就可以正常输出我们求和后的值
多分枝的异常
当我们检测的时候呢
我们对我们的错误类型可以通过多分枝来去检测
那么这个except
except三个except是平行的
那么检测到一个
他就跳出这个except
执行下面的
也可以通过try去检测这个
我们如果对我们要检测的异常的类型不是很清楚的时候
我们可以通过这些异常类型的一个
Exception去检测
那我们也称之为一个万能异常的一个检测
然后检测到以后执行下面的这段代码
那么另外的话
我们的其实try...except一个完整的结构呢
是下面的这样子的
try 要检测的一个代码
然后呢except是触发异常执行代码
那如果没有触发异常
他就执行else后面的这段代码
finally后面的是不管有没有异常
触发了它都会执行这段代码
我们也来看右边这段代码的执行过程
那么可以看到try这个地方呢
是要转换s1
这个s1给了一个字符串
那么这时候呢
他会就会捕获一个错误
会捕获一个什么呀
他是一个值的一个错误
那这个值的错误捕获了以后呢
就输出我们这个错误3
那么这个不能正常转换这个s1
finally后面呢都是要输出的
如果给的我们的给的代码是
给的是一个数字的字符串呢
那他就可以正常的转换
那这时候呢
他就可以执行完这一段的以后呢
except except 都没有捕获的话
他就执行else后面输出try这段代码段没有异常的这个文字的输出
然后finally输出
把它执行的过程是这样子
那么最后呢
我们可以使用raise触发异常
那么使用raise抛出一个指定的异常
也是看一下我们这个这段代码
那么这段代码是输入了一个math的一个模块
就是我们常用的算术运算了一些函数包含在里面
那这个里面我们要用他的一个平方根
那么输入这个数字如果是小于0的话呢
这个数字他就会抛出一个异常
那么可以看到我们执行以后呢
输入一个5的时候呢
他就输出5的平方根
那这边的如果我们输入一个什么呀
-9的时候呢
他就会抛出异常
抛出异常他告诉我们是这一句出现问题是什么呀
数值不能为负
那我们同样在jupyter下面看一下我们前面这些代码的执行过程
好了我们看这个
不可预知的多分支的这个异常的检测
我们来可以看一下这个给了一个s1是一个字符串
s2是一个字典类型
那我们如果我们下面只有这条这几条语句
我们看看他们都可能发生什么错误
第一条呢try里面int这是不能正常转换的
我们执行以后可以看的到
他是什么呀
是3啊
就是值的一个错误
不能够正常转换啊
我们再如果把它标注了看后面的有没有问题
我们看看下面就print这个语句
print(s1[9])
我们可以看到s1里面下标为9
执行的话他会捕获一个错误
就是我们下标越界的这样一个错误
所以是错误一
我们再看看下面一个print语句
print这个字典s2里面键值是namek的
那么看这里面有没有呀
那没有
他也会捕获到错误
运行可以看到捕获了错误是2
就是这个键值的这个错误
这是多分支的一个异常的捕获
那我们也还可以通过try这个Exception
把他的Exctption来去捕获
一样他可以捕获到一个错误
那么这个错误就是我们这个他的一个
一个转换了一个错误
也可以通过多分支加一个万能的错误
我们可以看的到我们在这个地方的时候
这是也是多分支下面是捕获的时候它可以是1,2
前面的IndexError或者ValueError
这个都不是的时候呢
可以看看是不是Exception
这时也是一个多分支和万能分支的一个捕获的一个错误
我们来看前面的这些错误呢
我们可以运行下可以看到
那么还是一个什么呀
他捕获到一个
捕获到这个ValueError
第一个而这样的一个错误
这个里面如果不是这三个错误的话
他就可以捕获的是一个Exception
最后看一下这个try...finally
try...finally的话我们当hello是有错的时候
hello是字符串的时候转换时有错误
那么就捕获到异常
捕捉到异常输出
我们可以看print语句和else它的输出
那么这个有捕获的异常finally是正常输出
如果我们是这个地方给的是一个数字
那么可以看到else这段代码就可以执行
那么else这段代码也可以正常执行
这最后是我们可以看的到通过raise来指定抛出异常的这样的一段代码
我们也是运行
我们输入一个-6
他就捕获到一个异常数值
那我们如果是输入的是正常的时候
他就给我们正数大于0的数据
大于0的他就给我们输出正常的平方根
上面我们介绍了异常处理的不同的方式
那么有异常处理呢
那其实在我们写代码时候是有许多好处的
首先把错误处理和真正的工作分开来
第二呢就是代码更容易组织
更清晰复杂的工作任务更容易实现
程序也变得更安全了
不至于由于一些小的错误
或者输入而使程序意外崩溃
那我们这一章的主要给大家介绍了程序控制
选择是如何控制的
循环是如何控制的
以及我们最后异常处理是如何控制的
那这一章的我们就给大家介绍到这
-章测试
-章测试
-第一章:python简介
--章测试
-第二章:编码规范
--2.2常量和变量
--章测试
-第三章:数据类型
--章测试
-第四章:基本运算
--4.2比较运算符
--4.3逻辑运算符
--4.4位运算符
--章测试
-第五章:程序控制结构
--5.1顺序结构
--5.2条件结构
--5.3循环结构
--5.4跳转结构
--5.5异常处理
--章测试
-第六章:函数、模块与面向对象
--6.2面向对象
--6.4模块与包
--章测试
-第七章:文件操作
--7.2文件的写入
--章测试
-第八章:python生态库
--章测试
-第九章:TensorFlow基础
--章测试
-第十章:实例分析与实践
--章测试
-第十一章:人工智能在自然语言中的应用
--章测试