Python 中的断言与异常该怎么选择?

Python 中的断言与异常该怎么选择?

异常,在程序运行时出现非正常情况时会被抛出,比如常见的名称错误、键错误等。

 

断言,判断某个表达式的真假,真则程序继续执行,否则抛出 AssertionError 异常。

理解这两个概念不难,但是什么时候使用谁却让很多开发者难以选择。本文呢,我会举一些例子,说明使用断言或异常的合适场景,并作小结。当然,只是个人经验,有不合理的地方也请指出。

什么时候使用断言

你可以使用断言去检查代码中的确定量。确定量怎么理解?在当前情境下,确定量总会满足特定条件。比如,在某段代码里,变量 x 的值始终应该在 0 到 1 之间。

断言能够帮助别人或未来的你理解代码,找出程序中逻辑不对的地方。一方面,断言会提醒你某个对象应该处于何种状态,另一方面,如果某个时候断言为假,会抛出 AssertionError 异常,很有可能终止程序。

下面是一些断言有用的地方

例一

例二

比如你在网上填调查问卷时,一个单选题,往往有个自定义选项,当你选择该项时,需要自己填写相应的内容。

例三

参数校验

有的时候断言会被用到函数参数校验的地方,我们应该避免这种使用方式。因为,如果 Python 以 -O 选项执行的话,assert 语句会被跳过。这样的话,我们的校验语句都会失效。

断言为假触发的异常的语义相比于一般的异常也不太明确。比如,当需要使用 int 类型的时候用户传入 string 类型手动触发一个 TypeError ,或是当需要正数但接收到负数的时候手动触发一个 ValueError ,都比 AssertionError好理解一些。

例一

像这种情况,使用异常显然更好。

例二

假设我们要在 LDAP 服务器上的一个组中删除或编辑一个用户

这个情况下,用断言更合适。因为 _modify_group() 是在程序内部被调用的,而不会被用户手动调用。

我们应该抛出哪种类型的异常

编写代码的时候,学会使用一些内建的异常,特别是 ValueError 、AttributeError 、TypeError 和 RuntimeError 。常见的库抛出的异常都是有规律的,很多库都有一个基本的异常类型。比如,Requests 的自定义异常都是继承的 RequestError 。

如果有人使用你的库,这样的话他们就能比较方便的捕捉相应的异常。如果你抛出各式各样的异常,又没有文档说明,很多时候用户便会捕捉一个大范围的异常,比如 [Base]Exception 等。

记住,尽量避免捕获 [Base]Exception ,这个有不少副作用。它可能会捕捉到(也有可能忽略)键盘中断( KeyboardInterrupt )( CTRL + C)或断言错误( AsstionError )等异常。所以,你也不应该抛出 [Base]Exception 异常。

小结

* 使用断言去检测程序中理论上不应该出现的情况。注意 Python 带 -O 选项执行时,断言会被忽略。

* 当由用户输入或者外部环境(比如网络延迟、文件不存在等)引起的问题时,我们应抛出异常。

* 尽量避免抛出或捕获 [Base]Exception 。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值