非常是Python顺序在运转过程当中激发的毛病,假如顺序中激发了未举行处置惩罚的非常,顺序就会由于非常而停止运转,只需为顺序增加非常处置惩罚,才能使顺序更“硬朗”。
Python对非常的处置惩罚,有它本身的语法情势,控制如安在Python中处置惩罚非常和举行顺序调试,重要内容有:
- 列表项目
- 列表项目
- 语法毛病;
- 非常的观点;
- 用try语句捕捉非常;
- 罕见非常的处置惩罚;
- 自定义非常;
- 运用pdb调试Python顺序。
7.1 语法毛病
1.拼写毛病
即Python言语中的关键字写错,变量名、函数名拼写毛病等。
关键字拼写毛病时会提醒SyntaxError(语法毛病)
,而变量名、函数名拼写毛病会在运转时给出NameError的毛病
提醒.
2.剧本顺序不符合Python的语法范例
比方如少了括号,冒号等标记,以及表达式誊写毛病等。
3.缩进毛病
由于Python语法划定,以缩进作为顺序的语法之一,这应当是Python言语奇特的一面。平常来说Python规范的缩进是以4个空格作为一个缩进。固然,你能够依据本身的习气,运用Tab也能够。但同一个顺序或项目中应当一致运用同一种缩进作风。
7.2 非常的处置惩罚
非常是Python顺序在运转过程当中激发的毛病。假如顺序中激发了未举行处置惩罚的非常,剧本就会由于非常而停止运转。只需在顺序中捕捉这些非常,并举行相干的处置惩罚,才能使顺序不会中断运转。
7.2.1 非常处置惩罚的基本语法
Python中运用try语句来处置惩罚非常,和Python中其他语句一样,try语句也要运用缩进构造,try语句也有一个可选的else语句块。平常的try语句基本情势以下。
try: <语句(块)> #能够发生非常的语句(块) except <非常名1>: #要处置惩罚的非常 <语句(块)> #非常处置惩罚语句 except <非常名2>: #要处置惩罚的非常 <语句(块)> #非常处置惩罚语句 else: <语句(块)> #未触发非常,则实行该语句(块) finally: <语句(块)> #一直实行该语,平常为了到达开释资本等目标
在现实运用中能够依据顺序的须要而运用部份语句,罕见的情势有:
情势一:
try: <语句(块)> except <非常名1>: <语句(块)>
举例:
def testTry (index, flag=False): stulst = ["John","Jenny","Tom"] if flag: #flag为True时,捕捉非常 try: astu = stulst [index] except IndexError: print("IndexError") return "Try Test Finished!" else: #flag为False时,不捕捉非常 astu =stulst [index] return "No Try Test Finished!" print("Right params testing start...") print (testTry (1, True)) #不越界参数,捕捉非常(一般) print (testTry (1, False)) #不越界参数,不捕捉非常(一般) print("Error params testing start...") print (testTry (4, True)) #越界参数,捕捉非常(一般) print (testTry (4, False)) #越界参数,不捕捉非常(顺序运转会中断)
情势二:
try: <语句(块)> except < 非常名1>: <语句(块)> finally: <语句(块)>
举例:
def testTryFinally (index): stulst = ["John","Jenny", "Tom"] af = open ("my.txt", 'wt+') try: af.write(stulst[index]) except: pass finally: af.close() #不管是不是发生越界非常,都封闭文件 print("File already had been closed!") print('No IndexError...') testTryFinally (1) #无越界非常,一般封闭文件 print('IndexError...') testTryFinally (4) #有越界非常,一般封闭文件
7.2.2 Python重要的内置非常及其处置惩罚
在Python中罕见的非常都已预定义好了,在交互式环境中,用dir(__builtins__)敕令,就会显示出一切的预定义非常。
非常名 | 形貌 |
---|---|
AttributeError | 挪用不存在的要领激发的非常 |
EOFError | 碰到文件末端激发的非常 |
ImportError | 导入模块失足激发的非常 |
IndexError | 列表越界激发的非常 |
IOError | I/O操纵激发的非常,如翻开文件失足等 |
KeyError | 运用字典中不存在的关键字激发的非常 |
NameError | 运用不存在的变量名激发的非常 |
TabError | 语句块缩进不正确激发的非常 |
ValueError | 搜刮列表中不存在的值激发的非常 |
ZeropisionError | 除数为零激发的非常 |
except语句重要有以下几种用法:
except: #捕捉一切非常; except <非常名>: #捕捉指定非常; except (非常名1,非常名2): #捕捉非常名1或许非常名2; except <非常名> as <数据>: #捕捉指定非常及其附加的数据; except(非常名1,非常名2)as <数据>: #捕捉非常名1或许非常名2及非常的附加数据。
7.3 手工抛出非常
为了顺序的须要,顺序员还能够自定义新的非常范例,比方对用户输入文本的长度有请求,则能够运用raise激发非常,以确保文本输入的长度符合请求。
7.3.1 用raise手工抛出非常
运用raise激发非常非常简朴,raise有以下几种运用体式格局。
raise 非常名
raise 非常名,附加数据
raise 类名
运用raise能够抛出种种预定的非常,纵然顺序在运转时基本不会激发该非常。
def testRaise2(): for i in range (5): try: if i==2: #i==2抛出NameError非常 raise NameError except NameError: print('Raise a NameError!') print (i) print('end...') testRaise2 ()
运转效果:
0 1 Raise a NameError! 2 3 4 end...
7.3.2 assert语句
assert语句的平常情势以下。
assert <条件测试>, <非常附加数据> #个中非常附加数据是可选的
assert语句是简化的raise语句,它激发非常的条件是厥后面的条件测试为假。
举例:
def testAssert(): for i in range (3): try: assert i<2 except AssertionError: print('Raise a AssertionError!') print (i) print('end...') testAssert()
运转效果:
0 1 Raise a AssertionError! 2 end...
assert语句平常用于在顺序开辟时测试代码的有效性。比方某个变量的值必须在肯定范围内,而运转时获得的值不符合请求,则激发该非常,对开辟者予以提醒。所以平常在顺序开辟中,不去捕捉这个非常,而是让它中断顺序。原因是顺序中已涌现了题目,不该继续运转。
assert语句并非老是运转的,只需Python内置的一个特别变量__debug__为True时才运转。要封闭顺序中的assert语句就运用python-O(短画线,后接大写字母O)来运转顺序。
7.3.3 自定义非常类
在Python中定义非常类不必从基本完整本身定义,只需经由过程继续Exception类来建立本身的非常类。非常类的定义和其他类没有区分,最简朴的自定义非常类以至能够只继续Exception类,类体为pass如:
class MyError (Exception): #继续Exception类 pass
假如须要非常类带有肯定的提醒信息,也能够重载__init__和__str__这两个要领。【相干引荐:python视频教程】
以上就是python毛病、非常和顺序调试的要领引见(附代码)的细致内容,更多请关注ki4网别的相干文章!