异常即是一个事件,该事件会在程序执行过程中发生,影响程序的正常执行。一般情况下,在Python无法正常处理程序时就会发生一个异常。
常见异常和错误
1、SyntaxError
语法错误。可能是拼写不正确、符号错误、缺失等。例如,比较符号应该是【==】,而不是【=】。
a = 10
if a = 9:
print('大')
##########################
if a = 9:
^
SyntaxError: invalid syntax
2、IndentationError
缩进错误。Python遵循严格的缩进规则。例如,print行没有缩进。
a = 10
if a > 9:
print('大')
##################################
print('大')
^
IndentationError: expected an indented block
3、TypeError
类型错误。执行了对某一类型无效的操作。例如,整型+字符串。
a = 10
if a > 9:
print(a + '大')
##############################################
print(a + '大')
TypeError: unsupported operand type(s) for +: 'int' and 'str'
4、IndexError
序列中没有此索引(index)。例如,列表取值超出范围。
a = [1, 3, 5]
print(a[4])
#############################
print(a[4])
IndexError: list index out of range
5、NameError
未声明/初始化对象 (没有属性)。例如,没有声明变量b就对其执行操作。
a = [1, 3, 5]
print(b[4])
#############################
print(b[4])
NameError: name 'b' is not defined
6、ValueError
传入无效的参数。例如,试图将一个与数字无关的类型转化为整数。
print(int('大'))
##############################################
print(int('大'))
ValueError: invalid literal for int() with base 10: '大'
7、KeyError
映射中没有这个键。例如,用字典里没有的键访问数据。
dic = {'name':'polly', 'sex': 'female'}
print(dic['age'])
##############################################
print(dic['age'])
KeyError: 'age'
8、ZeroDivisionErro
除(或取模)零 (所有数据类型)。例如,10/0在数学上是不成立的。
print(10/0)
##############################################
print(10/0)
ZeroDivisionError: division by zero
9、AttributeError
对象没有这个属性。
class Person():
def __init__(self):
self.name = 'polly'
self.sex = 'female'
p = Person()
print(p.age)
##############################################
print(p.age)
AttributeError: 'Person' object has no attribute 'age'
异常处理
捕捉异常可以使用try/except语句。
try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。
如果你不想在异常发生时结束你的程序,只需在try里捕获它。
try的工作原理是,当开始一个try语句后,python就在当前程序的上下文中作标记,这样当异常出现时就可以回到这里,try子句先执行,接下来会发生什么依赖于执行时是否出现异常。
- 如果当try后的语句执行时发生异常,python就跳回到try并执行第一个匹配该异常的except子句,异常处理完毕,控制流就通过整个try语句(除非在处理异常时又引发新的异常)。
- 如果在try后的语句里发生了异常,却没有匹配的except子句,异常将被递交到上层的try,或者到程序的最上层(这样将结束程序,并打印默认的出错信息)。
- 如果在try子句执行时没有发生异常,python将执行else语句后的语句(如果有else的话),然后控制流通过整个try语句。
- finally是无论是否发生异常都将执行最后的代码。
try:
code #需要判断是否会抛出异常的代码,如果没有异常处理,python会直接停止执行程序
except: #这里会捕捉到上面代码中的异常,并根据异常抛出异常处理信息
#except ExceptionName,args: #同时也可以接受异常名称和参数,针对不同形式的异常做处理
code #这里执行异常处理的相关代码,打印输出等
else: #如果没有异常则执行else
code #try部分被正常执行后执行的代码
finally:
code #退出try语句块总会执行的程序