---恢复内容开始---
异常处理
indexerror [] [1]
keyerror{} ['key']
EODError pickle.load()
filenotfounderror open('aa')
modulenotfounderror imoprt aaaaaaaaaaaa
valueerror int ('adada)
语法错误应该在写代码的时候就规避掉
例如读取的字符串有问题,就是一些弱智问题,从一开始就该规避掉
最容易出异常的时候是你要处理的内容不确定的时候
1.有用户参与
2.有外界数据接入:从文件中读 从网络上获取
多行报错是为什么
在嵌套调用的过程中,内部代码出了问题,外部所有的调用的地方都成为报错追溯信息的一部分
解决方法从下往上找,先找到写的代码,出错的那一行 , 看看是否能看出问题 , 把最后一行的错误类型和详细提示,去百度翻译
try: 和 except是一起使用的,在他俩中间的错误代码,都会被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 :
# # 从上向下报错的代码只要找到一个和报错类型相符的分支就执行这个分支中的代码,然后直接退出分支
# print('请输入一个数字')
# except IndexError :
# # 如果找不到能处理和报错类型相同的分支,会一直往下走,最后还是没有找到就会报错
# print('只能输入1或2')
多分支合并
# 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) : 就是把2个错误类型放到一个except里
# print('您输入的内容不合法')
# 万能异常
# def buy():
# print('buy')
# name
#
# def back():
# print('back')
# [][1]
#
# def show():
# print('show')
# 1/0
#
# def main():
# l = [('购物',buy),('退货',back),('查看订单',show)]
# while True:
# for num,i in enumerate(l,1):
# print(num,i[0])
# num = int(input('num >>>'))
# print(l[num - 1])
# try:
# func = l[num - 1][1]
# func()
# except Exception: except exceptiom 这里无论有多少错误,都是执行下一句话
# print('用户在选择了%s操作之后发生了不可知的异常' % l[num - 1][0])
#
# main()
# as语法 能够将具体错误信息打印出来
其他代码同上
# try:
# func = l[num - 1][1]
# func()
# except Exception as e: 这个e是个变量,随便写什么都行
# print(e) 这个e会把这个错误类型给打印出来
# #print(e.args,e.__traceback__.tb_lineno,e.__traceback__.tb_frame) 这些都是多出来的 例如几行的代码错误
# print('用户在选择了%s操作之后发生了不可知的异常' % l[num - 1][0])
#
# main()
# 万能异常,相当于except Exception
# try:
# name
# [][1]
# int('aaa')
# except:
# print(123)
多分之 异常处理 , 这个就是把万能异常处理分开一下,可以自定义提示?简单真么说吧,上面的一定要可单独定义某些异常,下面的才是万能异常处理
# try:
# num = int(input('num >>>'))
# print(l[num - 1])
# func = l[num - 1][1]
# func()
# except (ValueError,IndexError) :
# print('您输入的内容不合法')
# except Exception as e:
# print(e)
# #print(e.args,e.__traceback__.tb_lineno,e.__traceback__.tb_frame)
# print('用户在选择了%s操作之后发生了不可知的异常' % l[num - 1][0])
# main()
先来针对性处理,再来通用性处理
# else分支
# try:
# print('aaa') # 给某某某发邮件
# # name
# # [][1]
# # 1/0
# except NameError: # 网络不稳定,邮箱地址错误
# print('name error')
# except IndexError:
# print('index error')
# except Exception as e:
# print('Exception')
# else: # 当try中的代码不发生异常的时候 走else分支 如果发送成功了 进行一些处理
# print('else') 只有当上面没有任何错误 try中文件正常执行了之后,才走这句话
接下来讲的是finally
# try:
# f = open('www','w')
# f.read()
# finally: # 即使遇到报错,程序结束,也会先执行finally中的代码,然后再结束程序
# f.close()
# print('文件已经关闭了')
# finally用来回收一些操作系统的资源 : 数据库连接 打开的文件句柄 网络连接
# 异常处理的几种情况
# try ... except
# try ... except ... else else绝不能单连try
# try ... finally finally可以单带try 但是finally只能再最后
# try ... except ... finally
# try ... except ... else ... finally finally 永远是在最后的 所有不管有错误没错误的都执行完再执行他,一般用于系统资源回收,数据库连接,打开的文件句柄,网络连接
# 主动抛出异常 : 是给其他开发者用的
# raise ValueError
# raise ValueError('你写的不对')
# django是别人写的程序 框架 --> 程序员用 这个没什么卵用,听老师说这个得是你牛逼了,自己开发软件了,给程序员用才行
断言也是什么卵用没有,平时应该用的上啊 老师说除了看源码,都不会用,
# 断言 - 语法
# assert 1==2 # 只能接受一个布尔值 False
# assert 1==1 # 只能接受一个布尔值 False
# print(123456)
# if 1 == int(input()):
# pass
# else:
# raise AssertionError
异常处理的忠告 如果程序没有完全处理完,千万不要在最外加异常处理
---恢复内容结束---