14 异常
作业解答
# 根据课堂上给出的上下文管理器,判断IO操作和文件操作那个速度快 from datetime import datetime import io class RunTime(object): def __enter__(self): self.start_time = datetime.now() print(self.start_time) return self.start_time def __exit__(self, exc_type, exc_val, exc_tb): self.end_time = datetime.now() print(self.end_time) print('运行时间为: %s' % (self.end_time - self.start_time)) sio = io.StringIO() sio.write('今天天气真好') with RunTime() as a: with open('duqusucai.py', 'r') as file: print(file.read()) with RunTime() as b: print(sio.getvalue()) # 运行结果: 2018-04-18 02:58:20.221762 今天天气真好 2018-04-18 02:58:20.228967 运行时间为: 0:00:00.007205 2018-04-18 02:58:20.229365 今天天气真好 2018-04-18 02:58:20.229521 运行时间为: 0:00:00.000156
一,认识异常
-
Python的异常结构
python中所有的异常都是继承自BaseException,分为四大类:
类型 | 描述 |
---|---|
SystemExit | python退出异常 |
Keyboardlnterrupt | 键盘打断(ctrl + c) |
GeneratorExit | 生成器退出 |
Exception | 普通异常 |
二,异常处理
例1:基本的try...except... try: # 首先写一个try,然后把所有可能出错的代码放进去,try后面必须赶上except print('------1------') # 第一条正确 print(a) # 第二条错误 print('------3-------') # 第三条正确 except: # 写上一个except pass # 下面是写 捕获到异常的处理方案 运行结果: ------1------
例2:捕获具体的异常 try: # 首先写一个try,然后把所有可能出错的代码放进去 print('------1------') # 第一条正确 print(a) # 第二条错误 print('------3-------') # 第三条正确 except NameError as info: # 写上一个except 捕获异常类型 print('捕获到异常代码,下面是异常代码:') print(info) 运行结果: ------1------ 捕获到异常代码,下面是异常代码: name 'a' is not defined
例3:捕获多种异常 # 写法一:可以写多个except try: pass except TabError: pass except NameError: pass # 写法二:在except后面用括号把多种异常类型给括起来 try: pass except(NameError,TabError): pass # 不确定的异常类型 try: pass except Exception: pass
例4:更加丰富的结构 try: # 首先写一个try,然后把所有可能出错的代码放进去 print('------1------') # 第一条正确 print(a) # 第二条错误 print('------3-------') # 第三条正确 except Exception as result: # 在这里用 as 将捕获到的异常 用这个变量保存起来 print('捕获到异常,会执行我下面的代码对异常进行处理') print(result) else: print('没有捕获到异常,执行我') finally: print('不管有没有异常,我都会执行') 运行结果: ------1------ 捕获到异常,会执行我下面的代码对异常进行处理 name 'a' is not defined 不管有没有异常,我都会执行
注意事项:
1. try 下面放可能出错的代码
2. except try下面的代码出错后,会执行except下面的代码
3. else try下面代码没有错误,执行else下面的代码
4. finally 不管try下面的代码有没有出错,始终都会执行
例5:自定义异常类型 class MyError(Exception): # 自定义的异常必须继承 Exception pass raise MyError # 主动抛出 自定义异常 运行结果: Traceback (most recent call last): File "/home/pyvip/pycharm/23班作业/异常.py", line 37, in <module> raise MyError # 主动抛出 自定义异常 __main__.MyError
raise 主动抛出异常
格式:raise 异常类型
注意:raise 是主动抛出后面写的异常类型
三,断言(类似raise)
if not False: raise Exception('条件不满足') 等效于: assert True # 不抛出异常 assert False # 抛出异常
-
例
def myfunc(num): assert type(num) == int: raise TypeError('不是数字') return num * 10 print(myfunc('hello')) # 若传入不为int会报错,反之则会正常运行
四,自行定义异常类型 (控制类型)
class NameMustBeLuckError(Exception): pass def myfunc(name): if name != 'luck': raise NameMustBeLuckError('The name must be luck!') try: print(myfunc('juhao')) except Exception as a: print(a) # 运行结果: The name must be luck!