小白学 Python(19):基础异常处理

人生苦短,我选Python
前文传送门
前面我们已经写了这么多示例代码了,对于报错信息各位同学可能都已经司空见惯了,今天我们就来聊一下报错信息的处理。

首先,程序在运行的过程中,产生了异常,这时,我们可能会有两种想法,第一种是针对这个异常做某些特殊的处理来进行程序的降级处理;第二种是希望程序忽略这个异常继续执行下去,这个异常可能并不干扰主逻辑的执行。
那这个时候我们怎么办呢?
有编程经验的同学马上就想到了,那我们去 try 它啊,在 Python 中,我们同样可以去 try 它,从字面意思上理解就已经非常清晰明确了,以下的内容是要尝试执行的。
语法:
try:
...(可能产生异常的代码)
except:
...(产生异常后的处理代码)
但是,还会有一种情况,不管上面的代码有没有出错,有一部分代码我们总希望它能执行,这时,我们可以添加另一个关键字 finally 。
从字面意思可以就可以看出来,这个是最后要执行的意思。
语法:
try:
...(可能产生异常的代码)
except:
...(产生异常后的处理代码)
finally:
...(一定要执行的代码)
下面开始我们今天的代码演示。
我们先拟定一个场景,我们定义一个除法函数,如果除数不为 0 ,是可以正常返回值的,如果除数为 0 ,那么整个程序肯定会直接异常报错。
def division(x, y):
try:
return x / y
except:
print('程序报错啦!!!')
return None
print(division(15, 5))
输出结果如下:
3.0
这时程序是可以正常输出的,这时我们修改一下调用的参数,改为 division(15, 0) ,看下输出结果:
程序报错啦!!!
None
可以看到,这里打印了我在程序中设置的 None ,并没有之前的红色的异常信息抛出。这里的 except 会捕捉我们所有的异常信息,但是,异常信息也是有很多分类的,比如我们之前遇到过的访问字典中不存在的 key 的异常 KeyError ,比如我们刚才捕捉到的 ZeroDivisionError 异常,还有也是我们之前遇到过的数组下标越界的异常 IndexError 。
比如这里的代码我可以捕捉更加详细的异常信息 ZeroDivisionError 。
def division1(x, y):
try:
return x / y
except ZeroDivisionError:
print('程序报错啦!!!')
return None
print(division1(15, 0))
输出结果如下:
程序报错啦!!!
None
那么,看到这里,你可能会有一个疑问,我们为什么要对异常分类,直接抓取所有异常不是更方便么?

当然,对于逻辑比较简单的程序,直接捕捉所有异常是更方便的,但是在某些特定的业务场景下,一段程序可能会抛出多种异常,我们希望根据异常种类的不同,定制不同的解决方案,至少我们知道当前的程序是抛出了什么异常,这时,程序异常分类就显得尤为重要。

我们这里演示一下,如果我们输出的值不是数字,是字符串的话。。。。
def division2(x, y):
try:
return x / y
except ZeroDivisionError:
print('您输出的除数为 0 !!!')
return None
except TypeError:
print('您输出的参数类型非法!!!')
return None
print(division2('python', 0))
输出结果如下:
您输出的参数类型非法!!!
None
对的,你没有看错,异常信息是能捕捉多个的,是可以并排写的。至于先抛出那个,就要看那个异常先发生了。
因为示例代码的逻辑过于简单,异常抛出顺序无法演示,请各位同学见谅(li zhi qi zhuang)。

上面我们还提到了 finally ,我们接着来演示 finally 这个关键字的使用。
def division3(x, y):
try:
return x / y
except ZeroDivisionError:
print('您输出的除数为 0 !!!')
return None
except TypeError:
print('您输出的参数类型非法!!!')
return None
finally:
print('你一定能看到我!!!')
print(division3(15, 3))
print(division3('python', 0))
可以看到,这里我使用有异常和正常无任何问题的数据进行测试,结果如下:
你一定能看到我!!!
5.0
您输出的参数类型非法!!!
你一定能看到我!!!
None
确实, finally 中的内容是能正常打印的,这里多提一句,这里经常的使用方式是来关闭一些 I/O 读写操作或者一些外部连接,如数据库、缓存服务等。
今天的内容就到这里,各位同学请回去自行尝试。
示例代码
本系列的所有代码小编都会放在代码管理仓库 Github 和 Gitee 上,方便大家取用。
小白学 Python(19):基础异常处理的更多相关文章
- 小白学 Python(20):迭代器基础
人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...
- 小白学 Python(21):生成器基础
人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...
- 小白学 Python(23):Excel 基础操作(上)
人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...
- 小白学 Python(24):Excel 基础操作(下)
人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...
- 小白学 Python 爬虫(36):爬虫框架 Scrapy 入门基础(四) Downloader Middleware
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
- 小白学 Python(5):基础运算符(上)
人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...
- 小白学 Python 爬虫(3):前置准备(二)Linux基础入门
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 Linux 基础 CentOS 官网: https: ...
- 小白学 Python 爬虫(4):前置准备(三)Docker基础入门
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
- 小白学 Python 爬虫(11):urllib 基础使用(一)
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
随机推荐
- 安装vant2.2.7版本报错These dependencies were not found: vant/es/goods-action-big-btn in ./src/config/vant.config.js......
一.问题 前天,在使用vant的checkbox复选框的时候,注意到新增加一个全选功能,通过 ref 可以获取到 CheckboxGroup 实例并调用实例方法.于是我就想用这个,但是按照上面的示例写 ...
- Redis面试篇 -- Redis主从复制原理
Redis一般是用来支撑读高并发的,为了分担读压力,Redis支持主从复制.架构是主从架构,一主多从, 主负责写,并且将数据复制到其它的 slave 节点,从节点负责读. 所有的读请求全部走从 ...
- Python 爬虫(四):Selenium 框架
Selenium 是一个用于测试 Web 应用程序的框架,该框架测试直接在浏览器中运行,就像真实用户操作一样.它支持多种平台:Windows.Linux.Mac,支持多种语言:Python.Perl. ...
- JVM垃圾回收(下)
接着上一篇,介绍完了 JVM 中识别需要回收的垃圾对象之后,这一篇我们来说说 JVM 是如何进行垃圾回收. 首先要在这里介绍一下80/20 法则: 约仅有20%的变因操纵着80%的局面.也就是说:所有 ...
- Django中CKEditor富文本编译器的使用
CKEditor富文本编辑器 1. 安装 pip install django-ckeditor 2. 添加应用 在INSTALLED_APPS中添加 INSTALLED_APPS = [ ... ' ...
- MySQL学习(二)索引原理及其背后的数据结构
首先区分几个概念: 聚集索引 主索引和辅助索引(即二级索引) innodb中每个表都有一个聚簇索引(clustered index ),除此之外的表上的每个非聚簇索引都是二级索引,又叫辅助索引(sec ...
- CentOS 7 环境下修改主机名
本篇文章简单介绍在CentOS 7的环境下更改主机名的方法步骤. 首先我们开启虚拟机,用root账户进行登陆,并且打开终端.我们看到默认的主机名是我们新建虚拟机时自定义的名称. 接下来我们用命令更改主 ...
- Halcon一日一练:图像设备介绍
Halcon在设计之初就提供了完整的图像采集方案,适应了多种图像设备采集图像,以及各种不同环境的采集方案. 通常情况下,图像的采集应该是所有机器视觉项目首要解决的任务,不幸的是,需要解决图像采集的问题 ...
- (一)如何理解java面向对象编程
哲学中,事物总是螺旋式上升,波浪式前进.因而编程也逐渐向人类更容易理解的方向前进,多年来人们苦苦追求的编程境界 : 高扩展性(extensibility),高复用性(reuseable).java语言 ...
- httprunner-1-linux下搭建hrun(上)
前言 相信不少小伙伴对开源项目 httprunner 都很感兴趣,我们来看下它的有哪些特点吧: 项目管理:新增项目.列表展示及相关操作,支持用例批量上传(标准化的HttpRunner json和yam ...