【学习笔记】python异常处理

时间:2019-02-17
本文章向大家介绍【学习笔记】python异常处理,主要包括【学习笔记】python异常处理使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

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)总结
  1. except 语句不是必须的,finally语句也不是必须的,但是二者必须要有一个。否则就没有try的意义了
  2. 不建议在并不清楚逻辑的情况下捕获所有异常,有可能其中隐藏了严重的问题
  3. 程序异常处理用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)


参考:https://zhuanlan.zhihu.com/p/27051142