环境小硕的转行之路-23-异常处理

异常处理

常见的变量代称

1.NameError 变量错误
2.IndexError 列表index错误
3.KeyError 字典的key不存在
4.EOFError iteration到末端
5.FileNotFoundError
6.8ModuleNotFoundError*
7.ValueError 值的类型不匹配
以下的应该在写代码的时候就规避掉
8.SyntaxError 语法错误
9.NameError 变量错误

需要报错的情景以及报错的常见情况

#什么时候最容易出异常:有用户参与的时候,有外界数据介入的时候,从文件里读或从网络上获取.
#当有多行报错的时候,为啥?
''' 
# def func1():name
# def func2():
#     func1()#最后才报func1()
# def main():
#     func2()#第二报func2()
# main()#先报main

 Traceback (most recent call last):
  File "C:/Users/Administrator/PycharmProjects/全栈学习/day20/01异常处理.py", line 18, in <module>
    main()
  File "C:/Users/Administrator/PycharmProjects/全栈学习/day20/01异常处理.py", line 17, in main
    func2()
  File "C:/Users/Administrator/PycharmProjects/全栈学习/day20/01异常处理.py", line 15, in func2
    func1()
  File "C:/Users/Administrator/PycharmProjects/全栈学习/day20/01异常处理.py", line 13, in func1
    def func1():name
  NameError: name 'name' is not defined
'''

  

except以及多分支

#try 可以只有一个 except可有多个(多分支),多分支合并: 多个error可以放到一个元组再放到一个except下.
# 多分支合并
 l = ['login','register']
 for num,i in enumerate(l,1):
     print(num,i)

 try:
     num = int(input('num >>>'))
     print(l[num - 1])
 except (ValueError,IndexError) :
     print('您输入的内容不合法')
 #万能异常except:(等所有程序开发完了,测试完了才开始用万能异常)
#示例:
def buy():
    print('buy')
    name#valueerror

def back():
    print('back')
    [][1]#indexerror

def show():
    print('show')
    1/0#zerodivisionerror

def main():
    l = [('购物',buy),('退货',back),('查看订单',show)]
    while True:
        for num,i in enumerate(l,1):
            print(num,i[0])
        num = int(input('num >>>'))#已知可能发生valueerror,可以利用多分支合并到下面的万能异常里面
        print(l[num - 1])
        try:
            # num = int(input('num >>>'))
            # print(l[num - 1])
            func = l[num - 1][1]
            func()
        # except (ValueError,IndexError):
        #     print('您输入的内容不合法')
        except Exception as e:#万能异常,应该永远放在最下面.相当于except:但except:取不到信息.
              print(e.args,e.__traceback__.tb_lineno,e.__traceback__.tb_frame)#发生了什么异常,在第几行发生的,
              print('用户在选择了%s操作之后发生了不可知的异常' % l[num - 1][0])
#
main()

  

else以及finally分支

#else分支
try:
    print('aaa')
    name
    [][1]
except NameError:
    print('name error')
except IndexError:
    print('index error')
except Exception as e:
    print('exception')
else:
    print('else error')#没有异常的时候才执行,如果程序成功了要汇报一句.
finally:
    print('finally')#无论如何都会被执行
finally分支
def func():
    f = open('file','r')
    try:
        while True:
            for line in f
                if line.startswith('a')
                    return line
    except:
        print('异常')
    finally:#即使报错,程序结束或者return,也会先执行finally中的代码,可以直接和finally去联用.有利地保障资源回收.
        f.close()
        print('文件已经关闭了')#with open有三个错误处理不了,关闭不了文件.
#finally用于回收一些操作系统的资源:比如文件句柄,网络连接,连接数据库就是借用了操作系统的网卡,
#总结:写一个try: 必须带上except or finally or except+else.
#主动抛出异常 用户输入了你不想让他输入的东西就主动抛异常.
# raise ValueError('你写的不对')#禁止给用户抛异常,给其它开发者用的.django是别人写的程序,是一个框架.

  

断言以一些注意事项

#断言 新语法
assert 1 == 2#只能接受一个布尔值,False报assertionerror,好比if,就是程序向下执行的先决条件.
print('123132123')

#自定义异常:学完面向对象之后学
#异常处理的忠告:
    #程序在没开发完成,禁止在最外层加异常处理.要在经过测试以后再加.

  

#最后加是为了增强客户体验,应该try:main(0 except exception as f:将错误加到程序里.
原文地址:https://www.cnblogs.com/negu/p/11739266.html