• 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
    
  • 相关阅读:
    uva 11355(极角计算)
    hdu 1029(hash)
    hdu 1024(dp)
    SPOJ DISUBSTR(字符串hash)
    SPOJ DISUBSTR(后缀数组)
    【Leetcode】Evaluate Reverse Polish Notation
    【Leetcode】Reverse Words in a String
    【Leetcode】Maximum Product Subarray
    【Leedcode】Insertion Sort List
    【Leetcode】Sort List
  • 原文地址:https://www.cnblogs.com/xuexianqi/p/13472272.html
Copyright © 2020-2023  润新知