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

原标题:还在 Bug 不断?不妨试试这 2 个装X技巧

作者 | luanhz

来源 | 小数志(ID:Datazhi)

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

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

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

Python异常分类

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

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

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

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

SyntaxError,语法错误,广泛存在

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

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

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

assert:断言

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

assert 关键字基本用法为:

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

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

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

除数是否不为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")

---------------------------------------------------------------------------

Asserti Traceback (most recent calllast)

in< module>

----> 1 div(1, "2")

indiv(x, y)

1defdiv(x, y):

2assert isinstance(x, ( float, int)) andisinstance(y, ( float, int)),

----> 3 "param `x` and `y` expected to be 'int' or 'float' type"

4assert y != 0, "param `y` should not to be exactly `0`"

5returnx/y

Asserti: param `x`and`y`expected tobe '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 ZeroDivisi("param `y` should not to be exactly `0`")

return x/y

div(1, 0)---------------------------------------------------------------------------ZeroDivisi Traceback (most recent calllast) in< module>----> 1 div(1, 0) indiv(x, y)3raiseTypeError( "param `x` and `y` expected to be 'int' or 'float' type")4ify == 0:----> 5 raise ZeroDivisi("param `y` should not to be exactly `0`")6returnx/y

ZeroDivisi: param `y`should nottobe exactly `0`

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

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

责任编辑:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/542198.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iOS10 UI教程视图的边界与视图的框架

2019独角兽企业重金招聘Python工程师标准>>> iOS10 UI教程视图的边界与视图的框架 iOS10 UI视图的边界 在视图的几何形状中我们提到了视图属性中的一部分属性可以将定义的视图绘制在屏幕上。其中典型的3个属性为边界属性、框架属性以及中心位置属性。 bounds表示的就…

Java System类runFinalization()方法及示例

系统类runFinalization()方法 (System class runFinalization() method) runFinalization() method is available in java.lang package. runFinalization()方法在java.lang包中可用。 runFinalization() method is used to run the finalize() methods of any object that are…

Linux中远程文件的传输

1. scp命令 scp file userip:/dir 把自己主机的文件远程复制到其他主机 scp userip:/file dir 把其他主机的文件远程复制到当前主机 注意&#xff1a;要关闭接受端的防火墙 把主机的file远程复制到IP为172.25.254.117的root用户的Desktop 把IP为172.25.254.117的root用户Deskt…

svn: Can't convert string from 'UTF-8' to native

详见&#xff1a;http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt227 svn 版本库中有文件是以中文字符命名的&#xff0c;在 Linux 下 checkout 会报错&#xff1a; svn: Cant convert string from UTF-8 to native encoding 然后 checkout 程序就退出了&#xff…

引入antd组件样式_个人作品:一个技术栈koa2+ mysql+react + antd的个人博客

前言此项目是个人博客&#xff0c;有前端界面后台管理系统&#xff1b;目的是当做react和node的练手项目&#xff0c;同时还可以了解到服务器nginx部署web站点以及备案和域名的基本操作流程。项目预览地址https://www.lxsblog.cn​www.lxsblog.cnGitHub地址LinWeb/blog​github…

Java ObjectOutputStream writeLong()方法与示例

ObjectOutputStream类writeLong()方法 (ObjectOutputStream Class writeLong() method) writeLong() method is available in java.io package. writeLong()方法在java.io包中可用。 writeLong() method is used to write the given 8 bytes long value. writeLong()方法用于写…

浅谈Jfinal急速开发框架

2019独角兽企业重金招聘Python工程师标准>>> 使用Jfinal一段时间了,记得当初14年吧,为了建立一个简单的门户网站,想找个轻量型的急速开发框架,然后搜到Jfinal,然后用了一段时间后,确实不错, 现在吧,随着时间的推移,作者对JFinal的版本迭代也是一直在努力,一直朝着优…

make 怎么降级_Ubuntu 中将 make 的版本降低

最新的 Ubuntu 版本使用的是 make 版本是 4.0.在编译 Android4.4 源码包时&#xff0c;由于 make 版本过高&#xff0c;命令提示行会提示编译 Android4.4 源码包需要 make 的版本为 3.81 或 3.82.build/core/main.mk:42: ****************************************************…

Java ObjectOutputStream writeChar()方法与示例

ObjectOutputStream类writeChar()方法 (ObjectOutputStream Class writeChar() method) writeChar() method is available in java.io package. writeChar()方法在java.io包中可用。 writeChar() method is used to write 2 bytes of a character value. writeChar()方法用于写…

虚拟机的管理

我们采用虚拟机的原因是什么呢&#xff0c;很简单就俩字&#xff1a; 节能 1. 管理虚拟机的命令&#xff1a; virt-manager开启虚拟机管理器virsh list显示正在运行的虚拟机virsh list --all查看所有虚拟机virsh start desktop打开虚拟机virsh shutdown desktop正常关闭虚拟机…

mybatis对java自定义注解的使用——入门篇

转自&#xff1b;https://www.cnblogs.com/sonofelice/p/4980161.html 1. 最近在学习spring和ibatis框架。 以前在天猫实习时做过的一个小项目用到的mybatis&#xff0c;在其使用过程中&#xff0c;不加思索的用了比较原始的一种持久化方式&#xff1a; 在一个包中写一个DAO的接…

Java BigDecimal toBigIntegerExact()方法(带示例)

BigDecimal类的toBigIntegerExact()方法 (BigDecimal Class toBigIntegerExact() method) toBigIntegerExact() method is available in java.math package. toBigIntegerExact()方法在java.math包中可用。 toBigIntegerExact() method is used to convert this BigDecimal int…

Linux中的软件管理

1. 使用已有的网络安装资源安装软件 cd /etc/yum.repos.d/ (移动到yum源指向的文件配置目录下&#xff09; vim westos.repo &#xff08;新建文件&#xff0c;yum下后缀必须为.repo) 编辑这个文件里面写 [redhat] &#xff08;软件仓库名称&#xff09; namefirefox &#x…

楚留香ai人脸识别_戴口罩居然也能人脸识别?这些AI黑科技真的藏不住了.........

当人工智能遇见影像技术&#xff0c;将会释放出多少意想不到的巨大能量&#xff1f;「喔图知图实验室」瞄准当下的影像痛点&#xff0c;持续发力升级AI黑科技&#xff0c;带来两大必杀技——人脸识别再度升级、AI智能旋转校正。戴口罩也能识别——人脸识别升级戴口罩人脸识别如…

android--------Popupwindow的使用

2019独角兽企业重金招聘Python工程师标准>>> PopupWindow在Android.widget包下&#xff0c;项目中经常会使用到PopupWindow做菜单选项&#xff0c; PopupWindow这个类用来实现一个弹出框&#xff0c;可以使用任意布局的View作为其内容&#xff0c;这个弹出框是悬浮…

使用JavaScript中的示例的escape()函数

While transferring the data over the network or sometimes while saving data to the database, we need to encode the data. The function escape() is a predefined function in JavaScript, which encodes the given string. 在通过网络传输数据或有时将数据保存到数据库…

安装虚拟机的脚本

1. 先安装生成自动安装脚本的工具 yum install system-config-kickstart -y 2. 打开这个软件 system-config-kickstart 基本设置&#xff1a;更改时区为上海&#xff0c;设置root用户密码 2&#xff09;设置安装方法为网络安装&#xff0c;将共享的镜像文件地址正确填写 3&…

小小小游戏

写着玩 FlappyBird 视频:https://pan.baidu.com/s/1sljIR5z 游戏:https://pan.baidu.com/s/1ge8j7Ej 项目:https://pan.baidu.com/s/1eSysxpw Breakout 视频:https://pan.baidu.com/s/1gfhv4hd 项目:https://pan.baidu.com/s/1hs8xPly QBert 视频:https://pan.baidu.com/s/1s…

go在方法中修改结构体的值_[Go]结构体及其方法

结构体类型可以包含若干字段&#xff0c;每个字段通常都需要有确切的名字和类型。也可以不包含任何字段&#xff0c;这样并不是没有意义的&#xff0c;因为还可以为这些类型关联上一些方法&#xff0c;这里可以把方法看作事函数的特殊版本。函数事独立的程序实体&#xff0c;可…

to_number用法示例_Number()函数以及JavaScript中的示例

to_number用法示例Number()函数 (Number() function) Number() function is a predefined global function in JavaScript, it used to convert an object to the number. If the function is not able to convert the object in a number – it returns "NaN". (Rea…