zoukankan      html  css  js  c++  java
  • 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.(清楚优于含糊)
  • 相关阅读:
    CentOS虚拟机和物理机共享文件夹实现
    集训第六周 数学概念与方法 概率 数论 最大公约数 G题
    集训第六周 数学概念与方法 概率 F题
    集训第六周 E题
    集训第六周 古典概型 期望 D题 Discovering Gold 期望
    集训第六周 古典概型 期望 C题
    集训第六周 数学概念与方法 UVA 11181 条件概率
    集训第六周 数学概念与方法 UVA 11722 几何概型
    DAG模型(矩形嵌套)
    集训第五周 动态规划 K题 背包
  • 原文地址:https://www.cnblogs.com/kylin5201314/p/13508208.html
Copyright © 2011-2022 走看看