|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
对于linux命令,一定要学会用man和info去查他们的解释;
翻译自StackOverflow中一个关于Python非常处置的问答。
成绩:为何“except:pass”是一个欠好的编程习气?
我经常在StackOverflow上看到有人批评关于except:pass的利用,他们都提到这是一个欠好的Python编程习气,应当制止。可我想晓得为何?偶然候我其实不在乎呈现的毛病,而是只想让我的程序持续举行下往。就像如许:
1
2
3
4
try:
something
except:
pass
为何这么利用except:pass欠好?这面前的缘故原由是甚么,是否是由于如许我会放失落一些本该被处置的毛病?仍是如许我会捕捉到一切范例的毛病?
最好回覆:
正如你所推测的那样,这么做切实其实有两个欠好的中央。起首,由于没有指定任何非常范例,以是会捕捉就任何范例的毛病。其次,捕捉到毛病以后只会复杂地让它经由过程而不是接纳需要的处置措施。
我接上去的注释也许会有点长,以是将重点总结以下:
1.不要将恣意范例的毛病作为捕捉对象。必需明白你想要捕捉的毛病范例,而且写明只捕捉它们。
2.不要试图复杂地唐塞毛病处置举措。除非这么做是有目标的,但这一般都不太好。
那末接上去让我们更深切一些:
不要将恣意非常作为捕捉方针
当在代码中的某个中央利用非常捕捉语句块时,你一般晓得这个中央大概会抛出非常,而且你也晓得这个中央大概会产生甚么样的成绩进而抛出何种非常,一旦非常被抛出,你将捕捉到这个非常并使程序回到正轨下去。这就意味着你必定对这类非常有所筹办,并可以在它产生的时分实时接纳措施举行处置。
举个例子,你必要用户输出一个数字,而且利用int()函数将用户输出的字符串转换为整数范例,这时候候你必定会想到假如输出的字符串并非数字,那末就会产生值毛病(ValueError)。假如真的产生了毛病,那末你能够经由过程复杂的让用户从头输出来让程序回到正轨,以是捕捉值毛病和促利用户从头输出就是一个对照公道的处置战略。再举一个例子,假如你想从一个文件中读取设置信息,但正巧这个文件不存在。那末由于这是一个设置文件,假如它不存在你会前往一些默许的设置选项,以是这个文件就不是这么需要了。在这个例子中,捕捉文件未找到毛病(FileNotFoundError)和前往默许设置项则是一个对照符合的处置战略。经由过程以上两个例子能够看到,我们都是在守候捕捉特定的毛病,而且针对每种毛病都有特定的处置战略。
但是,假如我们在这里捕捉一切的非常,那末为特定非常筹办的那些处置战略就会由于碰到非一般范例的非常而生效,这将会使得一般的程序流程中止而且没法恢复。
让我们仍是举设置文件的谁人例子。一般的处置战略是假如发明文件其实不存在,我们将利用默许的设置项,并大概在稍后决意是不是将以后的设置项主动保留为设置文件(如许的话下一次文件就一定存在了)。如今让我们假定我们捕捉到了一个IsADirectoryError或是PermissionError毛病,在这类情形下,我们大概不想让程序持续实行,我们仍旧可以利用默许的设置参数,可是随后我们就不克不及保留文件了。也有大概用户但愿利用自界说的设置项,以是如许的话就不克不及利用默许设置项了。以是我们这时候候大概必要当即告诉用户并中断以后程序。也有大概我们其实不想在这么一小块代码中做这么多的事变,而是让使用层面的部分往体贴它,以是我们也大概让这个毛病浮到顶层,让顶层的营业逻辑去向理。
在Python2idiomsdocument文档中也提到了一个复杂的例子:假如在我们的代码中呈现了一个复杂的拼写毛病而招致程序毛病。在这类情形下由于我们捕捉一切的非常,以是我们将会捕捉到称号毛病(NameErrors)和语法毛病(SyntaxErrors)。二者都是罕见的毛病,而且二者都是不但愿呈现在我们终极代码中的。可是由于我们甚么非常都逮,当非常产生时我们将没法辨别详细的毛病范例而且没法举行调试。
可是也存在如许一些并未事后筹办的伤害非常,诸如体系毛病(SystemError)就很少产生以致于我们基本没有筹办;这些非常一般必要更庞大的处置操纵,这些操纵一般大概会请求我们中断以后的事情。
在任何情形下,经由过程部分代码完成对一切非常的处置基础上都是不成能的,以是你应当有针对性的去向理那些经由筹办的特定非常。有些人曾倡议最少应当明白指明基础非常(Exception)如许的不包括诸如体系加入(SystemExit)和键盘中止(KeyboardInterrupt)如许计划用来停止使用程序的非常。可是我想说如许仍是不敷明白,而且我团体以为只要在一个中央才干仅仅只捕捉Exception或是任何范例的非常,那就是一个独自的,使用程序层面的非常捕捉器,而且这个捕捉器独一的义务就是往捕捉任何大概呈现的未经筹办的漏网非常。如许的话我们仍旧可以保存不测产生非常的相干信息作为进一步的代码扩大的根据(让然假如我们能让程序恢复的话),如许下一次我们就可以够把这个非常在符合的中央显式地指定出来或是引导我们撰写测试用例以包管毛病不再产生(固然了,这统统仍是要当我们对特定非常有所筹办时,没有筹办的非常仍是会溜失落)。
在非常处置的逻辑中,不要甚么都不做
当显式地捕捉到无限的几个非常以后,良多时分我们切实其实不必要做甚么出格的处置。这类情形下,exceptSomeSpecificException:pass这么做是能够的。可是年夜多半情形下,我们仍是必要一些与毛病恢复相干的代码,比方反复实验的举措和设置默许值。
同时也思索到别的情形,比方假如我们的代码布局已断定了必需不休实验直到乐成才干持续,那末甚么也不做就已够了。详细来讲,我们必要用户输出一个数字,由于我们晓得用户大概不会依照我们计划的那样做,以是我们会将这个部分放进一个轮回,好比像如许:
1
2
3
4
5
6
defaskForNumber():
whileTrue:
try:
returnint(input(Pleaseenteranumber:))
exceptValueError:
pass
由于我们会不休让用户输出直到没有非常抛出为止,这类情形下我们就不必要在except块中做其他任何出格的操纵,如许就够了。固然了,有人会说你最少应当让用户失掉一些毛病信息以明白他们为何在此被重复地请求输出。
在其他一些情形下,except块中的passing语句显现了我们并没有真实的对非常做好筹办。除非是一些复杂的非常(诸如值毛病ValueError或范例毛病TypeError)我们都应当做一些操纵,缘故原由也很分明,制止复杂的passing。假如真没甚么可做的(假如你真切实其实定),那末思索加一些注释性的正文在此;不然,请扩大except块增加一些恢复性的代码。
except:pass
按照它们在系统中的作用分成几个部分介绍给大家,通过这些基础命令的学习我们可以进一步理解Linux系统: |
|