zoukankan      html  css  js  c++  java
  • python异常:常见异常、处理、断言、自定义异常

    本文目录:

    一、异常是什么

    二、常见异常

    三、异常处理

    四、不太常用语法

    五、主动判处异常

    六、断言

    七、使用场景

    八、自定义异常类型

     

    一、异常是什么

    什么是异常?

    异常是错误发生前的一种信号
    如果没有人来处理这个信号 程序就会中断执行并抛出错误信息

    异常的分类:

    1.语法检查异常 这种异常是最低级异常 绝对不应该犯

    也非常好避免
    如果是编译器 会自动提示
    如果是文本编辑器 在你运行代码前 解释器会检查语法

    2.运行时异常(逻辑异常)

    这种异常只有在代码被执行时才能发现
    我们要处理的重点就是运行时异常
    
    特点:在没有运行代码前 是无法发现的 如果运行时异常已经发生并且没有正确处理他 就抛出错误信息 并且中断程序的执行 这是要我们学习异常解决的问题

    异常的组成

     1.追踪信息 (具体发生异常的位置 以及函数的调用顺序)
     2.异常的类型 (错误的类型)
     3.异常的消息 (详细的错误信息)
    """
        我们之所以学习异常处理
            为的是让我们的程序更加稳定 (健壮性) 不容易崩溃
    """
    name =
    def func():
        import xxaaa
    
    def func1():
        func()
    
    func1()

     

    二、常见异常

    """
        常见的发生原因:
        NameError  找不到这个名字 要么变量 要么函数
        ValueError 在调用一个函数时给的的值不正确
        TypeError 类型错误 例如字符串与数字加减乘除  调用一个不能被调用的类型
        ZeroDivisionError 除数不能为0
        KeyError 没有这个key
        IndexError 索引不存在
        StopIteration 没有更多的值可以迭代
        FileNotFoundError 文件不存在
        io.UnsupportedOperation  文件的操作不支持
        AttributeError 没有这个属性
        KeyboardInterrupt  程序被强行终止  ctrl+c
    """
    # print(helloword)
    # age = int(input("请输入年龄:"))
    # li = []
    # li()
    
    # "abc" + 123
    
    # 5 / 0
    # with open(r"D:上海python全栈4期day31异常处理1今日内容","rt") as f:
    #     pass
    # print(f)
    # f.read()
    
    
    # dic = {"age":20}
    # dic["sex"]
    
    # li = [1,2,3]
    # print(li[-100])
    
    # def my_iter():
    #     yield "a"
    #     yield "b"
    # i = my_iter()
    # print(next(i))
    # print(next(i))
    # print(next(i))
    
    # f = open("test","rt")
    # f.write("123")
    
    # li = []
    # li.abc
    
    
    # import time
    
    while True:
        pass

    三、异常处理

    """
        要处理异常
            要学的就是一个新的语法
    
        今后使用最多的写法:
        try:
            这里放可能出现异常的代码
        except: 异常的类型:
            当异常发生并且异常类型匹配时
            执行except中的代码
        注意:一旦try中有代码抛出了异常 后面的代码全都不执行
    
        练习: 捕获某种类型的异常 捕获任意类异常  感受一下执行顺序
    """
    #基本语法:
    # print("staring.....")
    # try:
    #     name
    # except NameError:
    #     print("名字找不到!")
    # print("end.......")

    # 多种异常类型处理 # print("staring.....") # try: # name # [][-1] # pass # except NameError: # print("名字找不到!") # except IndexError: # print("索引超出范围") # print("end.......") # 当代码可能出现多种异常时的写法 # print("staring.....") # try: # # name # # [][-1] # 1/0 # pass # except NameError: # print("名字找不到!") # except IndexError: # print("索引超出范围") # except ZeroDivisionError: # print("除数不能为0") # print("end.......") # 当代码可能出现多种异常时的写法2 # print("staring.....") # try: # {}["aaa"] # # name # # [][-1] # 1/0 # except (NameError,IndexError,ZeroDivisionError): # print("可能名字找不到! 可能所以超出范围 可能除数为0") # print("end.......") # 上面两种写法 都可以处理多种异常 但是 异常类型太多了 不可能全写完 # 万能异常类型 Exception 或BaseException 基于OOP的继承和多态 print("staring.....") try: # {}["aaa"] # name # [][-1] 1/0 except Exception: print("可能名字找不到! 可能所以超出范围 可能除数为0") print("end.......")

    四、不太常用的语法

    """
        不太常用的
        语法1
        try:
        except:
        else: try中没有发生异常时执行
    
        语法2
        try :
        except :
        finally : 无论是否发生异常 都会执行finally  可以用来回收系统资源!
    """
    # print("start...")
    # try:
    #     # 1/0
    #     [][1]
    #     pass
    # except ZeroDivisionError:
    #     print("除数异常")
    # except NameError:
    #     print("名字异常")
    # else:
    #     print("else会在 try中没有异常时执行")
    # print("end...")
    
    
    # finally
    # print("start...")
    # try:
    #     # 1/0
    #     # [][1]
    #     pass
    # except ZeroDivisionError:
    #     print("除数异常")
    # except IndexError:
    #     print("索引异常")
    # else:
    #     print("else会在 try中没有异常时执行")
    # finally:
    #     print("finally 无论异常是否发生 都会执行!")
    # print("end...")
    
    
    # 使用finally来回收资源
    try:
        f = open(r"D:上海python全栈4期day31异常处理1今日内容","rt",encoding="utf-8")
        f.read()
        # f.write("123")
    except Exception:
        print("发生异常了")
    finally:
        print("关闭文件!")
        f.close()
    
    
    
    
    
    print(f.closed)

    五、主动抛出异常

    """
        当程序中有一些限制 然而用户没有遵守 我们可以主动抛出异常
        语法:
            raise 异常类型(异常的详细信息)
            类型必须是BaseException的子类
    """
    # raise NameError("这就是名字不存在异常!")
    
    age = input("请输入整型的年龄:")
    if not age.isdigit():
        raise TypeError("你输入的不是整型!")
    age = int(age)
    print("十年后你%s岁" % (age + 10))

    六、断言

    """
        断言 可以理解断定  就是很清楚 很明确
        什么时候需要断定?
            下面的代码必须依赖上面代码的正确数据
        语法: assert 结果为Bool的表达式
            如果值为True 则继续往下执行
            为False 抛出一个 AssertionError 表示断言失败
        没有assert 也可以使用if来玩 assert 仅仅是简化了代码
    
    """
    
    # 第一部分代码 负责产生一个列表
    li = []
    # li.append(1)
    # li.append(2)
    # 这里一定要确保数据是有效的
    # if len(li) < 1:
    #     raise ValueError("列表中没有数据!")
    assert len(li) > 0
    # 需要使用列表中的数据来完成任务 如果没有数据无法完成
    print(li[0])
    print(li[0])
    print(li[0])
    print(li[0])

    七、使用场景

    try:
        print("业务逻辑分层复杂 写了好几百行!")
    except Exception:
        print("可能是文件不存在!")
    try:
        print("业务逻辑分层复杂 写了好几百行!")
    except Exception:
        print("类型不匹配!")
        print("业务逻辑分层复杂 写了好几百行!")
        print("业务逻辑分层复杂 写了好几百行!")
        print("业务逻辑分层复杂 写了好几百行!")
        print("业务逻辑分层复杂 写了好几百行!")
        print("业务逻辑分层复杂 写了好几百行!")
        print("业务逻辑分层复杂 写了好几百行!")
        print("业务逻辑分层复杂 写了好几百行!")
        print("业务逻辑分层复杂 写了好几百行!")
        print("业务逻辑分层复杂 写了好几百行!")
        print("业务逻辑分层复杂 写了好几百行!")
        print("业务逻辑分层复杂 写了好几百行!")
        print("业务逻辑分层复杂 写了好几百行!")
    except Exception:
        print("有点问题!")
    
    
    # 不应该滥用try except
    # 什么时候用? 如果你知道为什么出错 应该把代码修改正确 而不是加上try except
    # 你不清楚为什么会发生异常! 这时候用try
    
    try:
        f = open("xxxx","rt")
        f.read()
    except Exception:
        print("文件不存在!")

    八、自定义异常

    """
        当系统提供的这些异常类型 和你要描述的错误不匹配时 就需要自定义异常类型
        写法:
            class 自定义异常类型名称(BaseException):
        总结一下:之所以自定义异常类型 是为了更具体描述你的错误 让使用者一眼就看出了
    
        关键点:1.如何自定义异常类型
              2.在except中 使用as 来获取异常对象
    
    """
    # 你随便输入一句话 看我喜不喜欢  不喜欢我就抛出异常
    # 自定义异常类
    class UnlikeError(BaseException):
        def __init__(self,msg,text):
            self.msg = msg
            self.text = text
    # 函数中可能抛出异常 def hello(): text = input("输入一段话:") if text == "你真帅": print("你说得对!") else: raise UnlikeError("你再看看...","另一个参数")
    # 捕获异常 try: hello() # 获取异常对象 except UnlikeError as e: print(e.text)
  • 相关阅读:
    jQuery扩展extend一
    json对象的操作,json工具
    typeof操作符的返回值
    jacksonall的使用,解析json
    jQuery的扩展
    An Introduction to Computer Thinking
    lazy初始化和线程安全的单例模式
    Compiler Principle
    Lineare Algebra
    Mathematik
  • 原文地址:https://www.cnblogs.com/wuzhengzheng/p/10268514.html
Copyright © 2011-2022 走看看