14 异常

第15节 异常

作业解答

# 根据课堂上给出的上下文管理器,判断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
    passraise 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 * 10print(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!

猜你喜欢

转载自www.cnblogs.com/zcmq/p/9114150.html