什么时候会出现异常: 程序在运行过程中会出现报错,原因1 语法错误 ,在程序书写的时候就要规避掉 2要处理的内容不确定的时候:有可能是因为由用户参与也有可能 调用了外部数据,
异常处理的忠告:在最外层的异常处理应该在所有的开发结束之后才放
常见错误类型:
AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件ImportError 无法引入模块或包;基本上是路径问题或名称错误IndentationError 语法错误(的子类) ;代码没有正确对齐IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]KeyError 试图访问字典里不存在的键KeyboardInterrupt Ctrl+C被按下NameError 使用一个还未被赋予对象的变量SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)TypeError 传入对象类型与要求的不符合UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它ValueError 传入一个调用者不期望的值,即使值的类型是正确的
多行报错
在嵌套调用的过程中,内部的代码出了问题,外部所有的调用的地方都成为报错追溯信息的一部
当有多行报错的时候是为什么?# def func1():# name## def func2():# func1()## def main():# func2()
怎么解决 : 从下往上找 首先找到你写的代码 出错的那一行 看看能不能看出问题 就把报错的最后一行 错误类型和详细提示贴到百度里,结合报错的那一行解决问题 单分支: Try...except..
l = ['login','register']# for num,i in enumerate(l,1):# print(num,i)# try:# num = int(input('num >>>'))#输入的数字不是num里面的数字是会执行这一步# print(l[num - 1])# except ValueError : #输入非数字时 except处理的异常必须和实际报错的异常是相同的# print('请输入一个数字')# print(l[num - 1])
多分支: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')
多分支合并:Try...except(indexerror,nameerror)
# 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 Exception
# 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:# print('用户在选择了%s操作之后发生了不可知的异常' % l[num - 1][0])## main()
万能异常相当于try ...except
try:# name# [][1]# int('aaa')# except:# print(123)
多分支 + 万能异常 : 万能异常应该永远放在异常处理的最下面
# try:# pass# except (ValueError,IndexError):# print('针对性的处理')# except Exception as e:# print(e)# print('通用性的处理')
as语法 :能够将具体的错误打印出来
def buy(): print('buy') namedef back(): print('back') [][1]def show(): print('show') 1/0def 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 as e: print(e) #print(e.args,e.__traceback__.tb_lineno,e.__traceback__.tb_frame) print('用户在选择了%s操作之后发生了不可知的异常' % l[num - 1][0])main()
Else分支: 当try中的代码不发生异常的时候 走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')
finally 分支: 无论如何都会被执行,用来回收一些操作系统的资源 : 数据库连接 打开的文件句柄 网络连接
# def func():# f = open('file')# try:# while True:# for line in f:# if line.startswith('a'):# return line# except:# print('异常处理')# finally: # 即使return也会先执行fianlly中的代码# f.close()
raise:主动抛出异常 : 是给其他开发者用的
# raise ValueError('你写的不对') # django是别人写的程序 框架 --> 程序员用 断言 - 语法
# assert 1==2 # 只能接受一个布尔值 False # assert 1==1 # 只能接受一个布尔值 False # print(123456) # if 1 == int(input()): # pass # else: # raise AssertionError