Linux设计为何“except:pass”是一个欠好的Python编程习气?仓酷云
对于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系统: Windows?是图形界面的,Linux类似以前的?DOS,是文本界面的,如果你运行了图形界面程序X-WINDOWS后,Linux?也能显示图形界面,也有开始菜单、桌面、图标等。 Linux最大的特点就是其开源性,这一点是十分难得的,这也是它能够存在到现在的原因之一。 写学习日记,这是学习历程的见证,同时我坚持认为是增强学习信念的法宝。 选择交流平台,如QQ群,网站论坛等。 可以说自己收获很大,基本上完成了老师布置的任务,对于拔高的题目没有去做,因为我了解我的水平,没有时间和精力去做。? 学习Linux应具备的。[书籍+网络资源] 要增加自己Linux的技能,只有通过实践来实现了。所以,赶快找一部计算机,赶快安装一个Linux发行版本,然后进入精彩的Linux世界,相信对于你自己的Linux能力必然大有斩获。 我们自学,就这个循环的过程中,我们学习了基本操作,用vi,shell,模拟内存的分配过程等一些OS管理。 未来的学习之路将是以指数增加的方式增长的。从网管员来说,命令行实际上就是规则,它总是有效的,同时也是灵活的。 众所周知,目前windows操作系统是主流,在以后相当长的时间内不会有太大的改变,其方便友好的图形界面吸引了众多的用户。 永中office 2004增强版安装只需要默认安装即可使用并操作大多与win系统雷同,打印机的配置和管理,记录光盘等。 用户下达的命令解释给系统去执行,并将系统传回的信息再次解释给用户,估shell也称为命令解释器,有关命令的学习可参考论坛相关文章,精通英文也是学习Linux的关键。 硬盘安装及光盘安装,清楚了解安装Linux应注意的有关问题,如安装Linux应在最后一个分区内,至少分二个分区。
页:
[1]