1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270
| #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/10/17 14:24 # @Author : Ropon # @File : 20_01.py
# 异常是什么,比如: # IndexError [][1] # KeyError {}['key'] # EOFError pickle.load() # FileNotFoundError open('aaaa') # ModuleNotFoundError import aaaaaaadfdsdf # ValueError int('dsfsdfsdf')
# 语法错误,编写代码时就应该规避掉 # SyntaxError # NameError name
# 什么时候容易出现异常,当您输入的内容不确定,比如: # 有用户参与输入 # 有外界数据介入,比如从文件中读,从网络中获取
# 多行报错的原因是:一般在嵌套调用过程中,内部代码出现异常,外部所有调用的地方都成为报错追溯信息的一部分
# def func1(): # name # # def func2(): # func1() # # def func3(): # func2() # # def main(): # func3() # # main()
# 遇到多行报错,如何分析 # 从下往上分析,逐个检查出错行,分析您自己写的代码 # 如果找不到问题,就将最后一行的错误类型及详细提示复制到百度搜索
# lst = ['login', 'register'] # for num, i in enumerate(lst , 1): # print(num, i) # # try: # num = int(input("num >>")) # print(lst[num - 1]) # except ValueError: # print("请输入一个数字")
# lst = ['login', 'register'] # for num, i in enumerate(lst , 1): # print(num, i) # try: # num = int(input("num >>")) # print(lst[num - 1]) # except ValueError: # # 从上往下错误代码,匹配到一个报错类型分支就执行这个分支中的代码,然后退出分支 # print("请输入一个数字") # except IndexError: # # 如果找不到匹配的分支,就一直往下查找,最后依然没有找到匹配就报错 # print("只能输入1或2")
#合并多分支 # lst = ['login', 'register'] # for num, i in enumerate(lst , 1): # print(num, i) # try: # num = int(input("num >>")) # print(lst[num - 1]) # except (ValueError, IndexError): # print("输入不合法")
#万能异常 # def buy(): # print("buy") # name # # def back(): # print("back") # [][1] # # def show(): # print("show") # 1/0 # # def main(): # lst = [('购物', buy), ('退货', back), ('查看订单', show)] # while 1: # for num, i in enumerate(lst, 1): # print(num, i[0]) # num = int(input("num >>>")) # try: # print(lst[num - 1]) # func = lst[num - 1][1] # func() # except (ValueError, IndexError): # print('您输入的内容不合法') # except Exception: # print("用户选择%s操作之后发生未知错误" % lst[num - 1][0]) # # if __name__ == '__main__': # main()
# as语法 能够将具体错误信息打印出来 # def buy(): # print("buy") # name # # def back(): # print("back") # [][1] # # def show(): # print("show") # 1/0 # # def main(): # lst = [('购物', buy), ('退货', back), ('查看订单', show)] # while 1: # for num, i in enumerate(lst, 1): # print(num, i[0]) # num = int(input("num >>>")) # print(lst[num - 1]) # try: # func = lst[num - 1][1] # func() # except Exception as e: # print(e) # print("用户选择%s操作之后发生未知错误" % lst[num - 1][0]) # # if __name__ == '__main__': # main() # 万能异常相当于except Exception # try: # name # [][1] # int('aaa') # # except: # except Exception: # print("123")
# 多分支 万能异常,万能异常应该永远放到异常处理最下面
# def buy(): # print("buy") # name # # def back(): # print("back") # [][1] # # def show(): # print("show") # 1/0 # # def main(): # lst = [('购物', buy), ('退货', back), ('查看订单', show)] # while 1: # for num, i in enumerate(lst, 1): # print(num, i[0]) # num = int(input("num >>>")) # try: # print(lst[num - 1]) # func = lst[num - 1][1] # func() # except (ValueError, IndexError): # print('您输入的内容不合法') # except Exception: # print("用户选择%s操作之后发生未知错误" % lst[num - 1][0]) # # if __name__ == '__main__': # main()
# 总结 # try: # pass # except (ValueError,IndexError): # print("针对性处理异常") # except Exception as e: # print("通用办法处理异常")
# else分支 # try: # print("test") # # name # # [][1] # # 1/0 # except NameError: # print("NameError") # except IndexError: # print("IndexError") # except Exception as e: # print(e) # else: # print("else")
# finally分支 # try: # print("test") # # name # # [][1] # # 1/0 # except NameError: # print("NameError") # except IndexError: # print("IndexError") # except Exception as e: # print(e) # else: # print("else") # finally: # 无论如何都会被执行 # print("finally")
# def func(): # f = open('test.txt', 'r') # try: # while 1: # for line in f: # if line.startswith('a'): # return line # except: # print("异常处理") # finally: # 即使return也会先执行fianlly中的代码 # f.close() # # print(func())
# try: # f = open('test.txt', 'r') # f.read() # name # finally: #即使程序报错,在程序结束之前也会执行此分支代码 # f.close() # print("已关闭打开的文件")
# finally 通常用来回收一些系统的资源,比如数据连接,打开的文件,网络连接等 # 异常处理常用: # try ... except # try ... except ... else # try ... finally # try ... except ... finally # try ... except ... else ... finally
# 主动抛出异常,主要是给其他开发者看的 # raise ValueError("你写的不正确")
# python assert断言是声明其布尔值必须为真的判定,如果发生异常就说明表达示为假。 # 可以理解assert断言语句为raise-if-not,用来测试表示式,其返回值为假,就会触发异常。 # assert 2==1 False # assert 1==1 True # print("test")
# if 1 == int(input()): # print("test") # else: # raise AssertionError
# 自定义异常
# 最外层的异常处理应该在所有开发完成后才考虑,一般最后将错误写到文件中。 # def main(): # name # try: # main() # except Exception as e: # with open('error.log', 'a', encoding='utf-8') as f: # f.write(str(e))
|