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!
  • 相关阅读:
    luogu 1865 数论 线性素数筛法
    洛谷 2921 记忆化搜索 tarjan 基环外向树
    洛谷 1052 dp 状态压缩
    洛谷 1156 dp
    洛谷 1063 dp 区间dp
    洛谷 2409 dp 月赛题目
    洛谷1199 简单博弈 贪心
    洛谷1417 烹调方案 dp 贪心
    洛谷1387 二维dp 不是特别简略的题解 智商题
    2016 10 28考试 dp 乱搞 树状数组
  • 原文地址:https://www.cnblogs.com/zcmq/p/9114150.html
Copyright © 2011-2022 走看看