python 模块之路 异常处理基础 异常处理其他 报错处理
什么是异常
[][1] IndexError #报错 指示误差 {}['key'] KeyError #报错 字典关键字错误 pickle.load() EOFError #报错 读取异常 open('aa') FileNotFoundError #报错 文件内容不符 import aaaaa ModuleNotFoundError #报错 模块不符 格式错误 int('sdjkhf') ValueError #报错 给的值错误
语法错误 应该在写代码的时候就规避掉
# SyntaxError 语法错误 # NameError name 名称错误
什么时候最容易出异常 (当你要处理的内容不确定的时候)
有用户参与
有外界数据接入 : 从文件中读 或从网络上获取
# 当有多行报错的时候是为什么? # def func1(): # name # # def func2(): # func1() # # def main(): # func2() # # main() # 在嵌套调用的过程中,内部的代码出了问题,外部所有的调用的地方都成为报错追溯信息的一部分 # 怎么解决 # 从下往上找 首先找到你写的代码 出错的那一行 # 看看能不能看出问题 # 就把报错的最后一行 错误类型和详细提示贴到百度里,结合报错的那一行解决问题
单分支
l = ['login','register'] for num,i in enumerate(l,1): print(num,i) try: num = int(input('num >>>')) print(l[num - 1]) except ValueError : # except处理的异常必须和实际报错的异常是相同的 print('请输入一个数字') print(l[num - 1]) #如果给的值超出范围 则会报错 IndexError: list index out of range
指示误差 列表索引超出范围
多分支
# 多分支 # 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) : # 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: print('用户在选择了%s操作之后发生了不可知的异常' % l[num - 1][0]) main() #代码中已说明可能发生的异常
as语法 能够将具体错误信息打印出来
# 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 as e: # print(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) #int(整数) 打印123
多支行 + 万能异常 : 万能异常应该永远放在异常处理的最下面
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]) 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() try: pass except (ValueError,IndexError): print('针对性的处理') except Exception as e: print(e) print('通用性的处理')
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 分支
# 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: # 无论如何都会被执行 # print('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() # try: # f = open('www','w') # f.read() # finally: # 即使遇到报错,程序结束,也会先执行finally中的代码,然后再结束程序 # f.close() # print('文件已经关闭了') # finally用来回收一些操作系统的资源 : 数据库连接 打开的文件句柄 网络连接
异常处理的几种情况
# try ... except # try ... except ... else # try ... finally # try ... except ... finally # try ... except ... else ... finally
主动抛出异常 : 是给其它开发者用的
# raise ValueError # raise ValueError('你写的不对') # django是别人写的程序 框架 --> 程序员用
断言 - 语法
# assert 1==2 # 只能接受一个布尔值 False # assert 1==1 # 只能接受一个布尔值 False # print(123456) # if 1 == int(input()): # pass # else: # raise AssertionError
自定义异常 : 面向对象之后
# 异常处理的忠告,在最外层的异常处理应该在所有的开发结束之后才放 # main() #sdhjlkghl # try: # main() # except Exception as e: # 把e报错写到文件里
努力 奋斗