人生苦短,我选Python

前文传送门

小白学 Python(1):开篇

小白学 Python(2):基础数据类型(上)

小白学 Python(3):基础数据类型(下)

小白学 Python(4):变量基础操作

小白学 Python(5):基础运算符(上)

小白学 Python(6):基础运算符(下)

小白学 Python(7):基础流程控制(上)

小白学 Python(8):基础流程控制(下)

小白学 Python(9):基础数据结构(列表)(上)

小白学 Python(10):基础数据结构(列表)(下)

小白学 Python(11):基础数据结构(元组)

小白学 Python(12):基础数据结构(字典)(上)

小白学 Python(13):基础数据结构(字典)(下)

小白学 Python(14):基础数据结构(集合)(上)

小白学 Python(15):基础数据结构(集合)(下)

小白学 Python(16):基础数据类型(函数)(上)

小白学 Python(17):基础数据类型(函数)(下)

小白学 Python(18):基础文件操作

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

首先,程序在运行的过程中,产生了异常,这时,我们可能会有两种想法,第一种是针对这个异常做某些特殊的处理来进行程序的降级处理;第二种是希望程序忽略这个异常继续执行下去,这个异常可能并不干扰主逻辑的执行。

那这个时候我们怎么办呢?

有编程经验的同学马上就想到了,那我们去 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 上,方便大家取用。

示例代码-Github

示例代码-Gitee

小白学 Python(19):基础异常处理的更多相关文章

  1. 小白学 Python(20):迭代器基础

    人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...

  2. 小白学 Python(21):生成器基础

    人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...

  3. 小白学 Python(23):Excel 基础操作(上)

    人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...

  4. 小白学 Python(24):Excel 基础操作(下)

    人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...

  5. 小白学 Python 爬虫(36):爬虫框架 Scrapy 入门基础(四) Downloader Middleware

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  6. 小白学 Python(5):基础运算符(上)

    人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...

  7. 小白学 Python 爬虫(3):前置准备(二)Linux基础入门

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 Linux 基础 CentOS 官网: https: ...

  8. 小白学 Python 爬虫(4):前置准备(三)Docker基础入门

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  9. 小白学 Python 爬虫(11):urllib 基础使用(一)

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

随机推荐

  1. redis相关缓存知识

    Redis redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorte ...

  2. Cutting Sticks UVA - 10003

    题文: 见:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_proble ...

  3. 最全最强 Java 8 - 函数编程(lambda表达式)

    Java 8 - 函数编程(lambda表达式) 我们关心的是如何写出好代码,而不是符合函数编程风格的代码. @pdai Java 8 - 函数编程(lambda表达式) 简介 lambda表达式 分 ...

  4. 超炫酷的 IntelliJ IDEA 插件(一)

    工善其事必先利器 打开setting文件选择Plugins选项 Ctrl + Alt + S File -> Setting 我的idea是最新版本2019.02 有的和别人界面可能不一样 主界 ...

  5. GO 第一个程序Hello world

    第一个程序:HelloWorld 一.go项目工程结构 配置好工作目录后,就可以编码开发了,在这之前,我们看下go的通用项目结构,这里的结构主要是源代码相应地资源文件存放目录结构. 1.1 gopat ...

  6. Codeforces1141F_Same Sum Blocks

    题意 给定一个序列,求最多的不相交区间满足区间和相同. 分析 从暴力的角度想,是枚举区间再求和,反过来想,直接记录每个和对应是那些区间,然后排个序求最大不相交即可. 代码 #include <b ...

  7. Ubuntu 安装中文

    系统环境:

  8. Android 使用appcompat_v7包以及源码注意事项

    最近学习和实践Android,无数次被AS和gradle惨痛的折磨,于是决定坚守Eclipse阵地..真是无奈之举,AS和gradle对我而言就像win10一样不讨喜. 当然Eclipse中开发and ...

  9. Spring入门(五):Spring中bean的作用域

    1. Spring中bean的多种作用域 在默认情况下,Spring应用上下文中所有的bean都是以单例(singleton)的形式创建的,即不管给定的一个bean被注入到其他bean多少次,每次所注 ...

  10. C#发送电子邮件(SMTP)及outlook.com账号之概要

    这是关于c#发送电子邮件(SMTP)的技术笔记,以”简报“形式呈现. 因为最后成功通过outlook.com发送了邮件,所以,我觉得还是有必要 记录一下其中的要点. 一.技术核心 .net Frame ...