作者 | luanhz

来源 | 小数志(ID:Datazhi)

头图 |  CSDN 下载自东方IC

程序员每天遇到 bug 就像喝水吃饭一样稀松平常,关键在于怎么高效而不失优雅的面对这些 bug!所以,你还在固执的使用 try……except 吗?

为了提高程序运行的稳健性,几乎所有语言都提供了 try……except……用法, Python 也不例外。虽然 try……except……语法能够确保程序能够跳过异常代码片段,无论如何都继续执行下去,但有时主动的触发报错和异常也是一种行之有效的程序员装X护体方法。

本文主要介绍 Python 中的两个异常相关的关键字:assert 和 raise,前者用于断言发现潜在异常,后者用于触发报错,实际上二者功能有很大相近之处。

Python异常分类

Python内置了数十种Exception/Error类型,例如常见的如下几种:

  • IndexError,索引错误,例如引用了超出列表长度的索引

  • KeyError,键值错误,例如引用了字典中不存在的键值

  • NameError,未声明错误,例如引用了未赋值的对象或变量

  • SyntaxError,语法错误,广泛存在

  • IndentationError,缩进错误,这是Python摒弃花括号而用缩进区分代码段的特色产物

  • TypeError,类型错误,例如执行数字和字符串相加会引发此类错误

这些错误很常见,也比较直观易懂。但有没有考虑过主动触发这些错误呢?

assert:断言

assert 一般用于函数和类的内部,在执行具体逻辑前首先对输入参数和程序执行状态进行一定的检查和预判,仅当执行状态满足时才继续执行后续的逻辑,否则断言条件不满足,引发后续的提示。

assert 关键字基本用法为:

assert "条件判断", "条件不满足时输出的提示信息"

例如,设计一个两数相除的函数,那么应当在执行相除前检查:

  1. 两个输入参数是否为数值型

  2. 除数是否不为0

这一条件判断可用assert完成,并在条件不满足时优雅的提示报错:

 def div(x, y):assert isinstance(x, (float, int)) and isinstance(y, (float, int)), \"param `x` and `y` expected to be 'int' or 'float' type"assert y != 0, "param `y` should not to be exactly `0`"return x/ydiv(1, "2")---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
<ipython-input-206-579e0bede4d8> in <module>
----> 1 div(1, "2")
<ipython-input-205-258ec937e818> in div(x, y)1 def div(x, y):2     assert isinstance(x, (float, int)) and isinstance(y, (float, int)), \
----> 3                 "param `x` and `y` expected to be 'int' or 'float' type"4     assert y != 0, "param `y` should not to be exactly `0`"5     return x/y
AssertionError: param `x` and `y` expected to be 'int' or 'float' type

由于输入参数y是字符串类型,断言失败,引发断言错误

相较于 try……except……用法,assert 的最大意义在于能够及时发现程序中未按预期状态执行的错误,这在多人协作 coding 过程中,比 except 更能提供丰富的报错信息。

raise:触发异常

实际上,raise 关键字的哲学与 assert 是有相通之处的,只不过 assert 包含逻辑判断和触发提示信息两部分内容,而 raise 则只用于手动触发异常,且一般触发的是 Python 内置异常类型。某种程度上,raise 的灵活性要比 assert 低,在个人实际使用过程中也几乎很少用到。

raise关键字基本语法为:

raise 异常类名称(描述信息)

例如,仍以实现上述 div 函数功能为例,以 raise 关键字执行同样的断言功能,则可如下实现:

def div(x, y):if not isinstance(x, (float, int)) or not isinstance(y, (float, int)):raise TypeError("param `x` and `y` expected to be 'int' or 'float' type")if y == 0:raise ZeroDivisionError("param `y` should not to be exactly `0`")return x/ydiv(1, 0)
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
<ipython-input-213-4267cdef819f> in <module>
----> 1 div(1, 0)
<ipython-input-212-dce337c4d91a> in div(x, y)3         raise TypeError("param `x` and `y` expected to be 'int' or 'float' type")4     if y == 0:
----> 5         raise ZeroDivisionError("param `y` should not to be exactly `0`")6     return x/yZeroDivisionError: param `y` should not to be exactly `0`

由于除数为0,raise关键字触发异常

以上就是 Python 中这两个关键字的简单用法,单论其实质功能而言都称不上是不可或缺,甚至可能会觉得有些鸡肋,但不得不说在某些场景下二者其实都还是有用武之地,或许届时你的代码也可以如大佬一般:优雅高效,同时略显装X!


福 利CSDN旗下公众号全新搜索技能上线啦!只要在公众号内回复消息就能自动回复想搜索的内容啦!现在体验有惊喜,每日参与搜索打卡,连续打卡满3天、7天、14天均有CSDN精美礼品相送 百分百有礼!快戳每日体验CSDN公众号搜索功能打卡
更多精彩推荐
☞倪光南、求伯君“出山”:爱解 Bug、无惧“35岁魔咒”、编码之路痛并快乐!☞饿了么技术往事
☞我坦白!我是第五位飞上太空的程序员游客☞赠书 | 图像分类问题建模方案探索实践☞大神们都是如何在时间序列中进行特征提取的?看完就懂了!
☞Value DeFi遭黑客攻击始末,闪电贷这次又带走了700万美元
点分享点点赞点在看

还在 Bug 不断?不妨试试这 2 个装X技巧相关推荐

  1. pythonassertbug_还在 Bug 不断?不妨试试这 2 个装X技巧

    作者 | luanhz 来源 | 小数志(ID:Datazhi) 头图 | CSDN 下载自东方IC 程序员每天遇到 bug 就像喝水吃饭一样稀松平常,关键在于怎么高效而不失优雅的面对这些 bug!所 ...

  2. 你的Idea还可用吗?不妨试试另一个开发神器!

    文章目录 一.STS安装 1.STS下载 2.STS安装 二.STS使用 1.STS配置JDK 2.STS配置Maven 3.使用STS创建SpringBoot项目 三.优化STS 1.主题美化 2. ...

  3. 数据不够怎么训练深度学习模型?不妨试试迁移学习 ——重用神经网络的结构2...

    数据不够怎么训练深度学习模型?不妨试试迁移学习 本质就是这个图!pretrained model就是你截取的部分神经网络模型(迁移学习),而nanonet就是你自己加入的网络层. 随着深度学习技术在机 ...

  4. 伤疤好了有黑印怎么办_疤痕留下黑印怎么办 不妨试试这四种方法

    疤痕留下黑印怎么办 不妨试试这四种方法更新时间:2018-06-23 核心提示: 疤痕好转后可能会留下一些黑印,而去除这些黑印的方法也比较多,比如按摩可以促使局部血液循环速度加快,起到消除色素沉着的作 ...

  5. 解决Mac的奇葩痛点,不妨试试开源小众软件

    解决Mac的奇葩痛点,不妨试试开源&小众软件 https://post.smzdm.com/p/685067/ 家喻户晓的知名软件好比开架商品,能够解决你大部分的痛点,但你要是个越用越挑剔的人 ...

  6. 用腻了几大主流音乐平台?不妨试试这几个小众又精致的音乐App

    现在有很多小伙伴包括小编都喜欢有事没事带着耳机听歌,沉浸在音乐的世界里.有不少小伙伴在用完几大主流音乐平台以后,也是会感觉有一点腻,没什么新鲜感.如果是这样的话,那大家不妨试试今天小编分享的这几款小众 ...

  7. 检验Xcode是否被改动过的简单方法,不妨试试!!!

    检验Xcode是否被改动过的简单方法,不妨试试!!! 在终端系统上运行以下命令启用检测: spctl --assess --verbose /Applications/Xcode.app 输入完成按回 ...

  8. 杂事缠身总分神,不妨试试番茄钟

    10月26日上午,我准备集中精力写上周的荐书文(我的公众号"程序视界"每周六荐书).于是,我就离开电脑,坐到客厅的茶几边上,摊开<赢在下班后>这本书和几张A4纸,准备学 ...

  9. 杂事缠身总分神,不妨试试番茄钟,亲测有效

    10月26日上午,我准备集中精力写上周的荐书文.于是,我就离开电脑,坐到客厅的茶几边上,摊开<赢在下班后>这本书和几张A4纸,准备学习. 恰好,我媳妇前两天拿回家一包红枣片,吃起来脆脆香香 ...

最新文章

  1. 静态方法和实例化方法的区别
  2. BufferedReader和BufferedWriter读写文件
  3. QML基础类型之font
  4. python获取系统时间函数_简单记录python的时间函数操作
  5. linux 下安装fbprophet
  6. Spring Boot(13)——使用RestTemplate
  7. 【Hadoop】HDFS三组件:NameNode、SecondaryNameNode和DataNode
  8. java根据富文本生成pdf文件
  9. SOA平台之争:Java EE,还是.NET……
  10. 免费下载加速软件IDM,让你的下载不限速,高达10M每秒
  11. excel表格显示无法连接服务器,excel中表格无法连接数据库-EXCEL 连接SQL SERVER数据库显示无法连接...
  12. 拼音加加符号编码列表
  13. Windows系统磁盘清理C盘扩容
  14. android多个柱状图和折线图,RecyclerView 实现柱状图和折线图
  15. 8.绘制统计图形——直方图
  16. 函数右括号错误! PreTranslateMessage(MSG* pMsg)未返回
  17. 清华计算机徐华简介,徐华
  18. CSS属性vertical-align详解(CSS之五)
  19. 12岁的微博回港上市,还有新故事吗?
  20. python--预测未来子女的身高、计算能量的消耗、为自己的手机充值、将指定的十进制数转换成二进制、八进制、十六进制

热门文章

  1. web前端基础之Bootstrap(三) - 插件
  2. C语言实现windows进程遍历
  3. 【七】jquery之属性attr、 removeAttr、prop[全选全不选及反选]
  4. 两个日期之间相差的天数
  5. 对博客园的建议与意见
  6. 矩池云Jupyterlab支持download as pdf
  7. leetcode python3 简单题198. House Robber
  8. 计算机辅助设计简称为才,计算机辅助设计知识分享.ppt
  9. 开心猫序列C语言,开心猫的读后感作文
  10. Flutter实战一Flutter聊天应用(二十一)