zoukankan      html  css  js  c++  java
  • 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!
  • 相关阅读:
    文件处理
    集合 字符编码
    3-11作业
    win 10 在vs2017下对mpi的安装以及认识
    java中二维数组的排序
    java中Arrays的用法
    java中随机二维数组中寻找最大值并输出坐标
    用java打印图形
    面向对象object与constructor
    for each in for in 与for of
  • 原文地址:https://www.cnblogs.com/zcmq/p/9114150.html
Copyright © 2011-2022 走看看