• Python异常处理


    一:什么是异常?

    异常时错误发生的信号,一旦程序出错 就会产生一个异常。
    如果该异常没有被处理,该异常就会被抛出来,程序的运行随即终止。

     

    异常组成的3部分

    1.Traceback:异常的追踪/回溯信息,定位到哪一行代码抛出了问题
    2.XXXError:异常的种类
    3.XXXError后的内容:异常的内容信息
     

    错误的2种方式:

    ①语法错误(SyntaxError):缺少:或者(等语法错误。
    ②逻辑错误(Name/Index/Key Error):变量未定义就直接使用等逻辑错误。
    # 逻辑错误
    NameError:变量名未定义
        x = 1
        print(y)
        
    IndexError:索引不存在
        l = [1,2,3]
        print(l[100])
        
    KeyError:键不存在
        d = {'k1':'asd'}
        print(d['a'])
    
    AttributeError:对象的属性不存在
        对象.属性
        
    TypeError:类型错误
        'asd'+111
     

    二:为何要处理异常?

     

    1.为了增强程序的 健壮性(鲁棒性),即便是程序运行过程中出错了,也不要终止程序

     

    2.而是捕捉异常并处理:将出错信息记录到日志内

     

    三:如何处理异常

     

    1.针对 语法的错误:应该在程序运行前,立即改正

     

    2.针对 逻辑的错误:例如先定义,后使用,要尽量避免

     

    3.如果逻辑错误发生的条件是可以预知的,应该用if判断拿来解决,预防异常

     

    4.如果逻辑错误发生的条件是不可预知的,那么异常一定会发生,考虑带程序的健壮性,我们应该处理异常,做好补救措施(能不写尽力不写)

    try:
        代码块
    except 异常的类型:
        发生异常后要执行的代码
     

    四:例子

     

    1.遇到异常,程序直接终止

    try:
        print("====>111")
        print("====>222")
        xxx
        # 遇到异常后,程序直接退出,后面的代码不会执行
        print("====>333")   
    except AttributeError as e:
        print(e)
    
    print('====>4')
    
    # 输出:
    # NameError: name 'xxx' is not defined
    # ====>111
    # ====>222
     

    2.指定异常

    try:
        print("====>111")
        print("====>222")
        xxx
        print("====>333")
    except NameError as e:  # 指定异常的类型(需要知道会抛出哪些异常)
        print(e)
    print('====>4')
    
    # 输出
    # ====>111
    # ====>222
    # name 'xxx' is not defined
    # ====>4
     

    3.合并抛出异常

    try:
        print("====>111")
        print("====>222")
        # xxx
        l=[]
        l[0]
        dic = {}
        # dic["k1"]
        print("====>333")
    except (NameError, IndexError) as e:    # 可以将2种异常合并输出
        print("=---->", e)
    except KeyError as e:
        print(e)
    print('====>4')
    
    # 输出
    # ====>111
    # ====>222
    # =----> list index out of range
    # ====>4
     

    4.finally不管有无异常,都会输出

    try:
        print("====>111")
        print("====>222")
        xxx = 111
        # l=[]
        # l[0]
        dic = {}
        # dic["k1"]
        print("====>333")
    except (NameError, IndexError) as e:
        print("=---->", e)
    except KeyError as e:
        print(e)
    finally:    # 不管是否有异常,都会执行
        print("一定会运行")
    print('====>4')
    
    # 输出:
    # ====>111
    # ====>222
    # ====>333
    # 一定会运行
    # ====>4
     

    5.万能异常Exception

    try:
        print("====>111")
        print("====>222")
        # xxx
        l = []
        # l[0]
        dic = {}
        dic["k1"]
        print("====>333")
    except Exception as e:  # 万能异常,可以接收任何类型的异常
        print("万能异常", e)
    print('====>4')
    
    # 输出:
    # ====>111
    # ====>222
    # 万能异常 'k1'
    # ====>4
     

    6.自定义异常

    print('==>11')
    raise NameError("变量名未定义")
    print('==>222')
    
    # 输出:
    # NameError: 变量名未定义
    class Animal:
        def speak(self):
            raise BaseException("小垃圾必须实现speak方法来覆盖")
    
    class Dog(Animal):
        pass
    
    d = Dog()
    d.speak()
    
    # 输出:
    # BaseException: 小垃圾必须实现speak方法来覆盖
    class Interface(BaseException):
        def __init__(self, msg, x, y, z):
            self.msg = msg
            self.x = x
            self.y = y
            self.z = z
    
        def __str__(self):
            return "<%s:%s:%s:%s>" % (self.msg, self.x, self.y, self.z)
    
    
    raise Interface("接口异常", 11, 22, 33)
    
    # 输出:
    # __main__.Interface: <接口异常:11:22:33>
     

    7.断言assert

    print("====1")
    print("====2")
    print("====3")
    salaries = [1.1, 2.2]
    
    # if len(salaries) != 3:
    #     raise NameError
    assert len(salaries) == 3
    
    print(salaries[2])
    
    # 输出:
    # AssertionError
    # ====1
    # ====2
    # ====3
    每天逼着自己写点东西,终有一天会为自己的变化感动的。这是一个潜移默化的过程,每天坚持编编故事,自己不知不觉就会拥有故事人物的特质的。 Explicit is better than implicit.(清楚优于含糊)
  • 相关阅读:
    Winform中实现ZedGraph曲线图缩放后复原功能
    MySQL Workbench 安装失败 Mysql workbench requires the visual C++ 2019 redistributable package
    MySQL Workbench 8.0提示SSL connection error: SSL is required but the server doesn‘t support it
    域名证书有效,但是访问提示不安全连接
    图片Base64编码
    centos系统设置防火墙
    《中有成就秘笈》之中央密严刹土
    Arweave
    去中心化身份聚合器
    区块链跨链技术
  • 原文地址:https://www.cnblogs.com/kylin5201314/p/13508208.html
Copyright © 2020-2023  润新知