ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python – 最好’尝试’某些东西并捕获异常或测试是否可以首先避免异常?

2019-09-15 13:58:14  阅读:196  来源: 互联网

标签:pep python if-statement exception-handling try-catch


我应该测试某些东西是否有效或者只是尝试这样做并捕获异常?

>有没有可靠的文件说一种方式更受欢迎?
>一种方式更pythonic?

例如,我应该:

if len(my_list) >= 4:
    x = my_list[3]
else:
    x = 'NO_ABC'

要么:

try:
    x = my_list[3]
except IndexError:
    x = 'NO_ABC'

一些想法……
PEP 20说:

Errors should never pass silently.
Unless explicitly silenced.

应该使用try而不是if被解释为默认传递的错误?如果是这样,你是否通过这种方式使用它来明确地对它进行静音,从而使它成为可能?

我指的是你只能单向做事的情况;例如:

try:
    import foo
except ImportError:
    import baz

解决方法:

如果导致if / else,你应该更喜欢try / except

>加速(例如通过阻止额外的查找)
>更清晰的代码(更少的行/更容易阅读)

通常,这些都是相辅相成的.

速度起坐

在尝试通过以下方式在长列表中查找元素的情况下:

try:
    x = my_list[index]
except IndexError:
    x = 'NO_ABC'

try是,当索引可能在列表中并且通常不引发IndexError时,除了是最佳选项.通过这种方式,您可以避免需要额外的查找,如果索引< LEN(MYLIST). Python鼓励使用异常,你处理的是一个来自Dive Into Python的短语.你的例子不仅处理异常(优雅地),而不是让它静默地传递,也只有在未找到索引的异常情况下才会发生异常(因此单词异常!).

清洁代码

官方Python文档提到EAFP:比请求更容易请求宽恕,Rob Knight注意到捕获错误而不是避免错误,可以使代码更清晰,更易于阅读.他的例子是这样说的:

更糟糕的是(LBYL’先看看你的飞跃’):

#check whether int conversion will raise an error
if not isinstance(s, str) or not s.isdigit:
    return None
elif len(s) > 10:    #too many digits for int conversion
    return None
else:
    return int(str)

更好(EAFP:更容易请求宽恕而不是许可):

try:
    return int(str)
except (TypeError, ValueError, OverflowError): #int conversion failed
    return None

标签:pep,python,if-statement,exception-handling,try-catch
来源: https://codeday.me/bug/20190915/1804955.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有