异常处理

程序中难免出现错误,错误分为两种:

  语法错误,这种错误无法避免,必须在程序执行前就要改正

  逻辑错误

python中异常种类:

  python中不同的异常可以使用不同的类型,常用异常如下:

AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的

异常处理:

  01.什么是异常处理?

    python解释器检测到错误,触发异常(同时也允许程序员自己触发异常),可以编写特定的代码,专门用来捕捉这个异常(这段代码与程序逻辑无关,与异常处理有关),如果捕捉成功就进入另外一个处理分支,执行定制的逻辑,使程序不会崩溃,这就是异常处理

  02.为什么要进行异常处理?

    python解析器执行程序,检测到了一个错误时,触发异常,异常触发后且没被处理的情况下,程序就在当前异常处终止,后面的代码不会运行,所以必须提供一种异常处理机制来增强你程序的健壮性与容错性.

  03.如何进行异常处理?

基本语法:

try:
    被检测的代码
except 异常类型:
    try检测到异常,就会执行这个位置的逻辑

  04.分类:

  (1)try单支:

try:
    lst = [1,2,3,4,5,6]
    lst[10]
except IndexError:        超范围异常,会跳过异常,直接执行print(666)
    print(666)

 

  (2)try多支:

try:
    lst = [1,2,3,4,5,6]
    lst[10]
    dic = {}
    print(dic['key'])
except KeyError as e:      如果dic={},print(dic['key'])在lst[10]上面,就先执行KeyError错误
    print(e)
except IndexError:
    print(123)          超出范围,执行print(123)

 

  (3)万能异常:

try:
    lst = [1,2,3]
    lst[6]
except Exception:
    print(666)
print(111)           不显示错误信息,跳过异常,往下执行

 

  (4)try多分支 + 万能异常:

def login():
    print('欢迎进入登录界面')
def register():
    print('欢迎进入注册界面')
dic = {1:login,2:register}
while True:
    print('''
    1.登录
    2.注册
    ''')
    try:
        num = int(input('请输入选项>>>'))
        dic[num]()
    except ValueError:
        print('请输入数字>>>')
    except KeyError:
        print('请输入正确序号>>>')

 

  (5)try except else:

try:              出现异常就执行else,否则就不执行
    a
    print(111)
except Exception:
    print(222)
else:
    print(333)
print(666)               结果:222,666 

 

  (6)try except finally: 不管是否出现异常都会执行,在异常出现之前会执行finally,通常是清理工作

s1 = 'hello'
try:
    int(s1)
except IndexError as e:
    print(e)
except KeyError as e:
    print(e)
except ValueError as e:
    print(e)
else:
    print('try内代码块没有异常则执行我')
finally:
    print('无论异常与否,都会执行该模块,通常是进行清理工作')

用途1: 关闭文件句柄,关闭数据库链接

try:
    f = open('user_id',mode='w',encoding='utf-8')
    f.write('...')   文件句柄操作的内容非常多
except Exception:
    print(123)
finally:
    print(333) 

用途2: 函数执行return之前能执行finally代码

def func():
     try:
         return 666
     finally:
         print(333)
 print(func())            结果为:333,666,在return之前执行finally

用途3: 循环中break之前可执行finally代码

while True:
    try:
        if 2 > 1:
            break
    finally:
        print(333)        在break执行之前,执行finally

 

  (7)raise主动抛出异常: 

try:
    raise TypeError('类型错误')
except Exception as e:
    print(e)

 

  (8)断言assert: 

class A:
    name = None
    def get(self):
        assert A.name is not None:    assert 1==1
        num = 123 
        for i in range(10):
            num += 1
            print(num)
obj = A()
# A.name = 'Barry'
obj.get()              结果为:133

 

  (9)自定义异常:

  当遇到一些大的项目,出现的错误是python解释器没有定义的数据类型,可以自定义一个异常处理的类,继承BaseException. 

class PhoneConnection(BaseException):
    pass
try:
    raise PhoneConnection('手机连接错误')
except Exception as e:
    print(e)

小结:

  异常处理不能经常使用,耗费性能;异常处理的分支越多,代码越冗余,可读性越差,所以能用程序解决的问题,尽量用程序解决

  使用 try...except 的方式:

    01.把异常处理和真正的工作区分开来

    02.代码更容易组织,更清晰,复杂的工作任务更容易实现

    03.使程序更加安全,不会因为一些小的疏漏而使程序意外崩溃

 

posted @ 2019-02-20 21:43  DF-包子  阅读(148)  评论(0)    收藏  举报