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

2020 年 11 月 19 日 CSDN
作者 | 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/y  div(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/yAssertionError: 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/y
div(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/y
ZeroDivisionError: param `y` should not to be exactly `0`

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

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

福 利

CSDN旗下公众号全新搜索技能上线啦!

只要在公众号内回复消息

就能自动回复想搜索的内容啦!


现在体验有惊喜,每日参与搜索打卡,

连续打卡满3天、7天、14天

均有CSDN精美礼品相送 百分百有礼!快戳

每日体验CSDN公众号搜索功能打卡


更多精彩推荐

倪光南、求伯君“出山”:爱解 Bug、无惧“35岁魔咒”、编码之路痛并快乐!

饿了么技术往事

我坦白!我是第五位飞上太空的程序员游客

赠书 | 图像分类问题建模方案探索实践

大神们都是如何在时间序列中进行特征提取的?看完就懂了!

Value DeFi遭黑客攻击始末,闪电贷这次又带走了700万美元

   
   
     
点分享
点点赞
点在看
登录查看更多
0

相关内容

程序猿的天敌 有时是一个不能碰的magic
专知会员服务
93+阅读 · 2020年12月26日
专知会员服务
102+阅读 · 2020年12月19日
【2020新书】C++20快速语法参考,第4版,209页pdf
专知会员服务
74+阅读 · 2020年8月5日
流畅的Python 中英文版 PDF 高清电子书
专知会员服务
82+阅读 · 2020年8月2日
【2020新书】现代C++初学者指南,301页pdf
专知会员服务
163+阅读 · 2020年7月24日
一份简明有趣的Python学习教程,42页pdf
专知会员服务
77+阅读 · 2020年6月22日
还在修改博士论文?这份《博士论文写作技巧》为你指南
机器学习入门的经验与建议
专知会员服务
94+阅读 · 2019年10月10日
一文看懂怎么用 Python 做数据分析
大数据技术
24+阅读 · 2019年5月5日
一个牛逼的 Python 调试工具
机器学习算法与Python学习
15+阅读 · 2019年4月30日
你真的会正确地调试 TensorFlow 代码吗?
数据库开发
7+阅读 · 2019年3月18日
怎么画高大上的神经网络结构?试试这个!
如何编写完美的 Python 命令行程序?
CSDN
5+阅读 · 2019年1月19日
教程 | PyTorch经验指南:技巧与陷阱
机器之心
15+阅读 · 2018年7月30日
开发、调试计算机视觉代码有哪些技巧?
AI研习社
3+阅读 · 2018年7月9日
实战 | 用Python做图像处理(一)
七月在线实验室
25+阅读 · 2018年5月23日
代码这样写不止于优雅(Python版)
数说工作室
4+阅读 · 2017年7月17日
Arxiv
0+阅读 · 2021年1月26日
Metrics for Explainable AI: Challenges and Prospects
Arxiv
4+阅读 · 2018年12月11日
Arxiv
4+阅读 · 2018年5月14日
VIP会员
相关VIP内容
专知会员服务
93+阅读 · 2020年12月26日
专知会员服务
102+阅读 · 2020年12月19日
【2020新书】C++20快速语法参考,第4版,209页pdf
专知会员服务
74+阅读 · 2020年8月5日
流畅的Python 中英文版 PDF 高清电子书
专知会员服务
82+阅读 · 2020年8月2日
【2020新书】现代C++初学者指南,301页pdf
专知会员服务
163+阅读 · 2020年7月24日
一份简明有趣的Python学习教程,42页pdf
专知会员服务
77+阅读 · 2020年6月22日
还在修改博士论文?这份《博士论文写作技巧》为你指南
机器学习入门的经验与建议
专知会员服务
94+阅读 · 2019年10月10日
相关资讯
一文看懂怎么用 Python 做数据分析
大数据技术
24+阅读 · 2019年5月5日
一个牛逼的 Python 调试工具
机器学习算法与Python学习
15+阅读 · 2019年4月30日
你真的会正确地调试 TensorFlow 代码吗?
数据库开发
7+阅读 · 2019年3月18日
怎么画高大上的神经网络结构?试试这个!
如何编写完美的 Python 命令行程序?
CSDN
5+阅读 · 2019年1月19日
教程 | PyTorch经验指南:技巧与陷阱
机器之心
15+阅读 · 2018年7月30日
开发、调试计算机视觉代码有哪些技巧?
AI研习社
3+阅读 · 2018年7月9日
实战 | 用Python做图像处理(一)
七月在线实验室
25+阅读 · 2018年5月23日
代码这样写不止于优雅(Python版)
数说工作室
4+阅读 · 2017年7月17日
Top
微信扫码咨询专知VIP会员