异常是Python程序在运行过程当中引起的错误,若是程序中引起了未进行处理的异常,程序就会因为异常而终止运行,只有为程序添加异常处理,才能使程序更“健壮”。python
Python对异常的处理,有它本身的语法形式,掌握如何在Python中处理异常和进行程序调试,主要内容有:程序员
1.拼写错误函数
即Python语言中的关键字写错,变量名、函数名拼写错误等。测试
关键字拼写错误时会提示SyntaxError(语法错误)
,而变量名、函数名拼写错误会在运行时给出NameError的错误
提示.ui
2.脚本程序不符合Python的语法规范debug
例如如少了括号,冒号等符号,以及表达式书写错误等。调试
3.缩进错误code
由于Python语法规定,以缩进做为程序的语法之一,这应该是Python语言独特的一面。通常来讲Python标准的缩进是以4个空格做为一个缩进。固然,你能够依据本身的习惯,使用Tab也能够。但同一个程序或项目中应该统一使用同一种缩进风格。继承
异常是Python程序在运行过程当中引起的错误。若是程序中引起了未进行处理的异常,脚本就会因为异常而终止运行。只有在程序中捕获这些异常,并进行相关的处理,才能使程序不会中断运行。资源
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) #有越界异常,正常关闭文件
在Python中常见的异常都已经预约义好了,在交互式环境中,用dir(__builtins__)命令,就会显示出全部的预约义异常。
异常名 | 描述 |
---|---|
AttributeError | 调用不存在的方法引起的异常 |
EOFError | 遇到文件末尾引起的异常 |
ImportError | 导入模块出错引起的异常 |
IndexError | 列表越界引起的异常 |
IOError | I/O操做引起的异常,如打开文件出错等 |
KeyError | 使用字典中不存在的关键字引起的异常 |
NameError | 使用不存在的变量名引起的异常 |
TabError | 语句块缩进不正确引起的异常 |
ValueError | 搜索列表中不存在的值引起的异常 |
ZeroDivisionError | 除数为零引起的异常 |
except语句主要有如下几种用法:
except: #捕获全部异常; except <异常名>: #捕获指定异常; except (异常名1,异常名2): #捕获异常名1或者异常名2; except <异常名> as <数据>: #捕获指定异常及其附加的数据; except(异常名1,异常名2)as <数据>: #捕获异常名1或者异常名2及异常的附加数据。
为了程序的须要,程序员还能够自定义新的异常类型,例如对用户输入文本的长度有要求,则可使用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...
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)来运行程序。
在Python中定义异常类不用从基础彻底本身定义,只要经过继承Exception类来建立本身的异常类。异常类的定义和其余类没有区别,最简单的自定义异常类甚至能够只继承Exception类,类体为pass如:
class MyError (Exception): #继承Exception类 pass
若是须要异常类带有必定的提示信息,也能够重载__init__和__str__这两个方法。