1.异常处理应用场景
1)内部代码异常抛出
2)应用于与外部资源进行交换的情况:
- 与计算机文件交互
- 与数据库进行交互
- 与外部进行http通信
2.Python的异常处理
异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常进行。一般情况下,在Python无法正常处理程序时就会发生一个异常。
异常是Python对象,就表示一个错误。
当Python脚本发生异常时我们需要捕获处理它,否则程序就会终止执行。
错误实例
Traceback(most recent call last):
File "xxx.py",line 15,in<module>
print(a)
NameError:name "a" is not defined
NameError(错误类型:属性值):name “a” is not defined(错误信息)
3.Python异常处理方式
1).所有错误都捕获
try:
#代码段
print(a)
except:
#代码异常时候的处理方式,不然就跳过except段
#pass是什么都不做
pass
2).捕获错误类型,把错误类型赋值给e
try:
print(a)
except Exception as e:
print(e)
常规错误可以被划分到BaseException或者Exception里面
3).确定错误类型,针对每个类型进行处理
try:
print(a)
except NameError as e:
print(e)
4).不论是否有错误,都要执行finally里面的语句
try:
print(a)
except NameError as e:
print(e)
finally:
print("finally")
5).else用法
#对比1
#print(a)报错print("Hello")语句没有执行
try:
print(a)
print("Hello")
except NameError as e:
print(e)
else:
print("finally")
等同于
#print(a)报错print("Hello")语句没有执行
try:
print(a)
except NameError as e:
print(e)
else:
print("Hello")
用途:用于代码监控,把需要监控的代码放在try后面,else后面放不需要监控的代码,可以把错误信息划分出来。
6)总结
- except 语句不是必须的,finally语句也不是必须的,但是二者必须要有一个。否则就没有try的意义了
- 不建议在并不清楚逻辑的情况下捕获所有异常,有可能其中隐藏了严重的问题
- 程序异常处理用if判断来过滤内部错误
3.Python上下文管理器
一般来说,对于文件数据库socket等资源,打开连接的数量是有限的,在处理文件之后我们需要关闭这些资源。
方式1:
def manage_1():
f = open("test.txt","w")
f.write("普通版")
f.close()
这样有个问题,当文件处理中出现异常,无法执行close命令,该进程就会一直占用文件,
方式2:
def manage_2():
f = open("test.txt","r")
try:
f.write("普通版")
except IOError :
print("write error")
finally:
f.close()
使用try语句对错误进行捕获,把close语句放到finally里面,不是是否有错误,文件都会被关闭
方式3:
with方法
with open("test.txt") as file:
res = file.read()
print(res)
#判断文件是否关闭
print(file.closed)
上下文管理器
任何使用和enter() 和exit()方法的对象都可称为上下文管理器,上下文管理器对象可以使用with关键字,。文件file对象也实现了上下文管理器。
首先先构建一个File类,实现enter和exit方法
class File():
def __init__(self,filename,mode):
self.filename = filename
self.mode = mode
def __enter__(self):
print("enter")
self.f = open(self.filename,self.mode)
return self.f
def __exit__(self,*args):
print("exit")
self.f.close()
使用 with 语句
with File('out.txt', 'w') as f:
print("writing")
f.write("hello, python")
print(f.closed)