通常异常处理分为三大类
语法错误 语意错误 逻辑错误
语法错误
语法错误一般都是少写了些标点符号
只要console看到SyntaxError 几乎都是语法错误
语义错误
例如 除以0为语义错误
逻辑错误
逻辑错误是比较难排查的,它跟代码无关,跟代码的设计有关
例如使用不当的循环,代码不报错,但是结果不是你想要的
这类的话要分析考虑你的流程,或者设计是不是有问题。
异常处理
代码有问题我们肯定要做出处理
就是把有可能出现错误的地方放到一个代码层面上去
try:
尝试
eccept 明确的类型错误:
except:
捕获
else:
都没捕获
try:
x = 5 / 0
print(x)
except ZeroDivisionError:
print('不能除0')
except:
print('其它错误')
else:
print('没有异常')
打印出异常的详细信息
例子2:
打印出类的name
如果打印出age会报错:
做出异常处理的代码:
class person:
def __init__(self,name):
self.name = name
p = person('peter')
try:
print(p.age)
except AttributeError as e:
print('属性错误 详细信息:',e)
except:
print('其它错误')
else:
print('没有错误')
finally 最终的意思
不管文件有没有异常最终都要处理的信息
那么什么时候加finally呢??
它是针对一些有需要释放资源的东西
例如 文件 数据库…. 读写一些内容遇到了问题,而文件已经打开了,中间如果遇到异常终止退出来的话,可能会影响后续的操作
所以要用finally
try:
f = open('date.txt')
f.read()
except:
print('文件操作遇到错误')
finally:
f.close()
异常有时候不一定非把它截断
但实际开发中有一个原则,在程序中有一个异常,不能就这么悄悄的过,你必须要处理 哪怕不处理至少要让它抛出来 终止程序
有的时候我们需要手动的抛出异常
手动抛出异常
手动抛出异常有什么意义呢???
例如:我们在c#,或者java定以了一个接口,而这个接口是必须要实现的,那这样我们可以把它写到一个方法里面
def method():
raise NotImplementedError('该方法代码还未实现')
method()
异常有很多详细参见官网的内置文档
https://docs.python.org/3.5/tutorial/errors.html