1.异常
1.1 程序中难免出现错误,而错误分成两种 (1)语法错误: SyntaxError if print(dsa 这种错误,根本过不了python解释器的语法检测,应该在写代码的时候就规避掉 (2)逻辑错误 name # name没有定义 res1=1/0 # 0不能做被除数 res2=1+'str' # 数字不能加字符串 1.2 什么是异常? 异常就是程序运行时发生错误的信号,异常发生之后,异常之后的代码就不执行了. for i in range(1090): print(i) name 在python中,错误触发的异常如下: 1.3 异常的种类 # NameError name # IndexError [][1] # KeyError {}['key'] # EOFError pickle.load () # FileNotFoundError open('aa') # ModuleNotFoundError import aaaaaaa # ValueError int('sadfg') 1.4 什么时候最容易出异常? # 你要处理的内容不确定的时候 # (1)有用户参与 # (2)有外界数据介入的: 从文件里读 从网络上获取 1.5 当有多行报错的时候是为什么? def func1(): name def func2(): func1() def main(): func2() main() # 在嵌套调用的过程中,内部的代码出了问题,外部的所有的调用的地方都成为报错追溯信息的一部分 # 怎么解决多行报错? # 从下往上找 首先找到你写的代码 出错的那一行 # 看看能不能看出问题 # 就把报错的最后一行 错误类型和详细提示贴到百度里,结合报错的那一行解决问题
2. 异常处理基础
2.1 单分支多分支异常处理 # 单分支 l = ['login', 'register'] for num, i in enumerate(l, 1): print(num, i) try: num = int(input("num >>>")) # 被异常处理机制包围的代码 except ValueError: # except处理的异常必须和实际报错的异常是相同的 print("请输入一个数字") print(l[num - 1]) # 多分支 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("您输入的内容不合法") 2.2 万能异常 # 万能异常 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) # 多分支 + 万能异常: 万能异常应该永远放在异常处理的最下面 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("通用性的")
2.3 异常处理其他
# (1)else分支 try: print('aaa') # 给某某发邮件 # name # [][1] # 1/0 except NameError: # 网络不稳定, 邮箱地址错误 print("name error") except IndexError: print("indec error") except Exception: print('Exception') else: # 当try中的代码不发生异常的时候,走else分支. 如果发送成功了 进行一些处理 print("else") # (2)finally异常 try: print('aaa') # 给某某发邮件 name # [][1] # 1/0 except NameError: # 网络不稳定, 邮箱地址错误 print("name error") except IndexError: print("indec error") except Exception: 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也会先执行finally中的代码 f.close() try: f = open('www', 'w') f.read() finally: # 即使遇到报错,程序结束也会先执行finally中的代码,然后再结束程序 f.close() print("文件已经关闭了") # finally用来回收操作系统的资源: 数据库连接 打开的文件句柄 网络连接 # 异常处理的几种情况 # try --- except # try --- eccept --- else # try --- finally # try --- except --- finally # try --- except --- else --- finally # (3)主动抛出异常: 是给其他开发者用的 # raise ValueError # raise ValueError('你写的不对') # django是别人写的程序 框架 --> 程序员用 # (4)断言 - 语法 # assert 1==2 # 只能结束一个布尔值 False # assert 1==1 # 只能结束一个布尔值 False # print("123456") # 相当于 if 1 == int(input()): pass else: raise AssertionError # (5)自定义异常: 面向对象之后
# 异常处理的忠告: 在最外层的异常处理应该在所有开发结束之后才放 # main() # dsafjka # try: # main() # except Exception as e: # 把报错写到文件里