5.1错误
Python中常见错误之一是语法错误(syntax errors)。
常见错误之二是在没有语法错误时,会出现逻辑错误。
当python检测到一个错误时,解释器就无法继续执行下去,于是抛出相应的信息,这些信息我们统称为异常信息。
5.2异常
常见的异常:
5.3 处理异常
为了让程序健壮,有时需要处理异常。
为使程序不因为错误而停止,需要程序中“异常处理”设置,如果没有“异常处理”,则当异常出现时就会导致程序中止。
5.3.1 try...except...
如果没有异常发生,except子句在try语句执行之后被忽略;如果try子句中有异常发生,该部分的其他语句被忽略,直接跳到except部分,执行其后面指定的异常类型及其子句。
except后面也可以没有任何异常类型,及无异常参数。如果这样,
不论try部分发生什么异常,都会执行except。
eval():
将字符串str当成有效的表达式来求值并返回计算结果。
raise :作为单独一个语句,它的含义是将异常信息抛出。
5.3.2 处理多个异常
处理过个异常并不是因为同时报出多个异常,程序在运行中,只要遇到一个异常就会有反应。所谓处理多个异常的意思是可以容许捕获不同的异常,由不同的except子句处理。
如果有多个except,try里面遇到一个异常,就转到相应的except子句,其他的忽略。如果except没有相应的异常,该异常也会抛出,不过这时程序就要中止了,因为异常“浮出”程序顶部。
除了用多个except之外,还可以在一个except后面放多个异常参数。
注意:多个参数一定要用圆括号包裹起来。
如果希望打印出默认错误但程序不能中断:python3中
except(ZeroDivisionError,ValueError)as e:
print(e)
5.3.3 else语句
try:
print("I am try")
except:
print("I am except")
else:
print("I am else")
I am try
I am else
try:
print(1/0)
except:
print("I am except")
else:
print("I am else")
I am except
except(Exception)as e: 不管什么异常都会捕获,并且传给变量e。
5.3.4 finally子句
有了finally,不管前面执行的是try,还是except,最终都要执行finally。因此,有一种说法是将finally用在可能的异常后进行清理。
5.3.5 assert语句
>>> assert 1==1
>>> assett 1==0
File "<stdin>", line 1
assett 1==0
^
SyntaxError: invalid syntax
assert,翻译过来就是“断言”之意。assert是语句等价于布尔真的判定,发生异常就意味着表达式为假。
应用情境就和意思一样,当程序运行到某个节点的时候,就断定某个变量的值是什么,或者对象必然拥有某个属性等,简单说就是断定什么东西必然是什么,如果不是,就抛出错误。
如果没有特别的目的,断言应该用于如下情况:
- 防御性的编程。
- 运行时对程序逻辑的检测。
- 合约性检查(比如前置条件,后置条件)。
- 程序中的常量。
- 检查文档。