异常处理
相关概念
- 错误:程序运行之前的语法问题,如:关键字出错、缩进不齐、括号不成对等
- 异常:程序运行过程中出现的问题,如:除数为0,对象属性不存在,字典的键不存在,下标越界
异常处理
-
说明:异常处理可以理解为特殊的流程控制语句,可以提高代码的健壮性。
-
语法:
try: print('正常代码') a = 3 / 0 print('执行结束') except Exception as e: # 捕获异常,可以做出异常处理 print('出现异常', e) print('OVER')
-
多异常处理:
# try: # # print(a) # # a = 3/0 # d = {} # print(d['name']) # except NameError as e: # print('NameError:', e) # except ZeroDivisionError as e: # print('ZeroDivisionError:', e) # except Exception as e: # print('Othre error:', e) try: # print(a) # a = 3 / 0 d = [1, 2, 3] print(d[4]) except (NameError, ZeroDivisionError) as e: # 将某些异常放在一起进行统一处理 print('name or zero:', e) except Exception as e: print('其他异常')
-
完整写法
try: print('正常代码') print(a) except Exception as e: print('出现异常', e) else: # 没有异常时会执行 print('正常结束') finally: # 无论有无异常都会执行 print('最后执行') print('OVER')
-
手动抛出异常
try: print('正常执行') # 根据业务逻辑分析,手动抛出异常 raise Exception('手动抛出的异常') print('执行结束') except Exception as e: print('出现异常:', e) print('OVER')
-
异常嵌套
print('我要去上班,什么事也阻止不了我上班的脚步') try: print('我准备骑电动车去上班') raise Exception('不知道那个缺德的家伙把我充电器拔掉了') print('骑电动车提前到达公司') except Exception as e: print('电车异常:', e) try: print('我准备坐公交去上班') raise Exception('等了20分钟没有公交车,果断放弃') print('乘坐公交准时到达公司') except Exception as e: print('公交异常:', e) print('我准备打车去公司') print('打车还是快,还是能够提前到达公司') print('热情饱满的开始一天的工作')
-
自定义异常类
# 自定义异常类 class MyException(Exception): def __init__(self, msg): self.msg = msg def __str__(self): return 'MyException:' + self.msg # 异常处理函数 def deal(self): print('按照特定的方案处理异常') try: print('正常运行') raise MyException('自定义异常') except MyException as e: print(e) # 特定的处理方案 e.deal() except Exception as e: print('Exception', e) print('OVER')
-
特殊场景
- 当进行文件操作时,无论过程是否出现异常,最后一定要关闭文件
- 使用with语句,保证文件关闭,无论中间是否出现异常
- 示例:
''' fp = open('xx.txt', 'r') content = fp.read(1024) print(content) # ... # 最后一定要关闭文件 fp.close() ''' with open('00-text.txt', 'r') as fp: content = fp.read(1024) # ... # 结束时不需要考虑文件的关闭问题 # 无论中间是否出现了异常,一定会确保文件关闭