- 常见异常
AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x IOError 输入/输出异常;基本上是无法打开文件 ImportError 无法引入模块或包;基本上是路径问题或名称错误 IndentationError 语法错误(的子类) ;代码没有正确对齐 IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5] KeyError 试图访问字典里不存在的键 KeyboardInterrupt Ctrl+C被按下 NameError 使用一个还未被赋予对象的变量 SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了) TypeError 传入对象类型与要求的不符合 UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量, 导致你以为正在访问它 ValueError 传入一个调用者不期望的值,即使值的类型是正确的
- 异常的分类:
- 基本结构:
try: 被检测的代码块 except 异常类型: try中一旦检测到异常,就执行这个位置的逻辑
- 单分支结构:
#单分支只能用来处理指定的异常情况,如果未捕获到异常,则报错 try: a except NameError as e: #我们可以使用except与as+变量名 搭配使用,打印变量名会直接输出报错信息 print(e) #name 'a' is not defined
- 多分支结构·:
l1 = [('电脑',16998),('鼠标',59),('手机',8998)] while 1: for key,value in enumerate(l1,1): print(key,value[0]) try: num = input('>>>') price = l1[int(num)-1][1] except ValueError: print('请输入一个数字') except IndexError: print('请输入一个有效数字') #这样通过异常处理可以使得代码更人性化,用户体验感更好。
- 万能异常处理类:
在python的异常中,有一个万能异常:Exception,他可以捕获任意异常。它是一把双刃剑,有利有弊,我们要视情况使用 如果你想要的效果是,无论出现什么异常,我们统一丢弃,或者使用同一段代码逻辑去处理他们,那么只有一个Exception就足够了。 如果你想要的效果是,对于不同的异常我们需要定制不同的处理逻辑,那就需要用到多分支了。我们可以使用多分支+万能异常来处理异常。使用多分支优先处理一些能预料到的错误类型,一些预料不到的错误类型应该被最终的万能异常捕获。需要注意的是,万能异常一定要放在最后,否则就没有意义了。 part5:try...else语句
- try else语句:
try: for i in range(10): int(i) except IndexError as e: print(e) else: print('***********') #*********** 执行了此处 #当try语句中的代码没有异常,被完整地执行完,就执行else中的代码
- try finally 语句:
def dealwith_file(): try: f = open('file',encoding='utf-8') for line in f: int(line) return True except Exception as e: print(e) return False finally: '''不管try语句中的代码是否报错,都会执行finally分支中的代码''' '''去完成一些连接操作的收尾工作''' print('finally 被执行了') f.close() ret = dealwith_file() print(ret)
- 还可以自定义默认异常处理类