python 异常处理
什么是异常?
什么是异常?

IndexError # [][1] KeyError #{}['key'] EOFError # pickle.load() FileNotFoundError # open('aa') ModuleNotFoundError # import aaaaaaaaaaa ValueError # int('sdjkhf') SyntaxError # 语法错误, 应该在写代码的时候就规避掉 NameError # name 单独的写个变量 ...等等 都是异常
什么时候容易出现异常?
当要处理的内容不确定的时候 :
有用户参与时,
有外界数据接入 : 从文件中读取, 从网络上获取
当有多行报错的时候是为什么?
def func1(): name # 只有变量会报错 def func2(): func1() def main(): func2() main() # 在嵌套调用的过程中,内部的代码出了问题, # 外部所有的调用的地方都成为报错追溯信息的一部分 # 怎么解决 # 从下往上找 首先找到你写的代码 出错的那一行 # 看看能不能看出问题 # 就把报错的最后一行 错误类型和详细提示贴到百度里,结合报错的那一行解决问题
如何进行异常处理?
# 异常处理的几种情况
# try ... except
# try ... except ... else
# try ... finally
# try ... except ... finally
# try ... except ... else ... finally
单分支
try ... except
# 单分支 ls = ['login','register'] for num,i in enumerate(ls,1): print(num,i) try: num = int(input('num >>>')) # 只能输入数字 (且 1 2 ) print(ls[num - 1]) except ValueError : # except处理的异常必须和实际报错的异常是相同的 print('请输入一个数字')
多分支
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 (Error1,Error2)
# 多分支合并 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('您输入的内容不合法')
万能异常
try ... 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()
as 语法 能够将具体的信息打印出来
try ... except Exception as e : print(e)
# 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()
多分支 + 万能异常
万能异常应该永远放在异常处理的最下面
# try:
# pass
# except (ValueError,IndexError):
# print('针对性的处理')
# except Exception as e:
# print(e)
# 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]) 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 中不发生异常的时候走 else 分支
# 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 分支
finally 分支 无论如何都会被执行, 且必须在异常处理的最后
finally 可以用来回收一些操作系统的资源 : 数据库连接, 打开文件句柄, 网络连接
参考文档 : https://blog.csdn.net/gyniu/article/details/80345160
# finally 和 return 连用, 会先执行finally中语句,再执行return 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()
# 遇到错误也会先执行finally,后报错 try: f = open('www','w') f.read() finally: # 即使遇到报错,程序结束,也会先执行finally中的代码,然后再结束程序 f.close() print('文件已经关闭了')
raise 主动跑出异常
是给其他开发者用的
# 主动抛出异常 : 是给其他开发者用的 # raise ValueError # raise ValueError('你写的不对') # django是别人写的程序 框架 --> 程序员用
断言 - 语法
assert 1==2 # 只能接受一个布尔值 False assert 1==1 # 只能接受一个布尔值 False print(123456) if 1 == int(input()): pass else: raise AssertionError
自定义异常
面向对象之后.

浙公网安备 33010602011771号