zoukankan      html  css  js  c++  java
  • Python之面向对象(七)异常处理

    异常处理

    1. 程序中的错误分为两种:语法错误和逻辑错误

      1. 语法错误:

      2. if
        
        #------------------
        print(haha
        
      3. 逻辑错误:

      4. #用户输入不完整(比如输入为空)或者输入非法(输入不是数字)
        num=input(">>: ")
        int(num)
        
    2. 什么是异常:代码发生异常错误之后,你的程序就中断了

    3. 什么是异常处理:当代码出现异常时,我通过某种方式不让你程序中断,合理的跳出去,叫做异常处理

    4. 为什么要有异常处理?用户体验良好,使你的代码更有健壮性容错性

    5. 异常处理的两种方式:

      • if判断式

        总结:

        1.if判断式的异常处理只能针对某一段代码,对于不同的代码段的相同类型的错误你需要写重复的if来进行处理。

        2.在你的程序中频繁的写与程序本身无关,与异常处理有关的if,会使得你的代码可读性极其的差

        3.if是可以解决异常的,只是存在1,2的问题,所以,千万不要妄下定论if不能用来异常处理。

      • python专有异常处理

        python:为每一种异常定制了一个类型,然后提供了一种特定的语法结构用来进行异常处理

    6. 错误举例:

      1. # 触发IndexError
        l=['egon','aa']
        l[3]
        # 触发KeyError
        dic={'name':'egon'}
        dic['age']
        
        #触发ValueError
        s='hello'
        int(s)
        
    7. 常用异常:

      1. AttributeError #试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
        IOError #输入/输出异常;基本上是无法打开文件
        ImportError #无法引入模块或包;基本上是路径问题或名称错误
        IndentationError #语法错误(的子类) ;代码没有正确对齐
        IndexError #下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
        KeyError #试图访问字典里不存在的键
        KeyboardInterrupt #Ctrl+C被按下
        NameError #使用一个还未被赋予对象的变量
        SyntaxError #Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
        TypeError #传入对象类型与要求的不符合
        UnboundLocalError #试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
        导致你以为正在访问它
        ValueError #传入一个调用者不期望的值,即使值的类型是正确的
        
    8. 单分支捕获异常:

      1. #基本语法:
        try:
            被检测的代码块
        except 异常类型:
        	try 一旦检测异常,就执行这个位置的逻辑
           
        try:
            num=int(input("----"))#出现ValueError错误之后,直接跳转到except语句
            dic={'name':"嘉欣"}
            print(dic['age'])
        except ValueError:
            print(66)
        
    9. 多分支捕获异常

      1. try:
            num=int(input("----"))#出现ValueError错误之后,直接跳传到except语句
            dic={'name':'加薪'}
            print(dic['age'])
            l1=[1,2]
            print(l1[100])
            print(11)
        except ValueError:
            print('输入有非数字元素')
        except KeyError:
            print('没有此键')
        except IndexError:
            print('没有此下标')
        print(666)
        
    10. 万能异常捕获:处理所有python识别的异常

      1. try:
            dic={'name':'嘉欣'}
            l1=[1,2]
            print(l1[100])
            print(111)
            for i in 123:
                pass
        except Exception as e:
            print(e)
        print(666)
        
    11. 什么时候用万能?什么时候用多分支?:如果你对错误信息不关心,只是想要派出错误让程序继续运行,就用万能异常 你对错误信息要进行明确的分流,让你的程序多元化开发

    12. 多分支+万能异常

      1. def func():
            pass
        
        
        def func1():
            pass
        
        
        dic = {
            1: func,
            2: func1,
        }
        
        try:
            num = int(input('请输入序号'))
            dic[num]()
        except ValueError:
            print('请输入数字')
        except KeyError:
            print('请输入范围内的序号')
        except Exception:
            print('程序出现意料之外的错误....')
        
    13. try.....else......finally

      1. try:
            dic = {'name': '嘉欣'}
            print(dic['age'])
            l1 = [1, 2]
            print(l1[100])
            print(111)
        except KeyError:
            print('没有此键')
        except IndexError:
            print('没有此下标')
        else:
            print('如果没有出现异常则执行这里')
        finally:
            print('finally 666')
        #except必须依赖于try,else必须依赖于except和try
        #finally只是依赖于try
        #当没有异常执行else finally 有异常则执行异常 和finally
        #finally 用在关闭数据库连接,文件句柄关闭,数据保存等,用到finally
        
    14. 主动触发异常

      1. class A:
            def func(self):
                raise Exception("使用父类方法")
        class B(A):
            def func(self):
                print("in B func")
        class C(A):
            def func(self):
                print("in C func")
        class D(A):
            def func1(self):
                print("in D func1")
        def function(obj):
            obj.func()
        obj1 = D()
        function(obj1)
        # 结果:
        Exception: 使用父类方法
        
    15. 断言:展现一种强硬的态度

      1. name="alex"
        n1=input("请输入")
        assert name=n1
        print(11)
        print(22)
        
    16. 自定义异常

      1. python中提供的错误类型很多种,但是不是全部的错误

      2. class LiYeError(BaseException):
        
            def __init__(self,msg):
                self.msg=msg
            def __str__(self):
                return self.msg
        
        try:
            # 三行
            raise LiYeError('socket.connent.....')
        except LiYeError as e:  # e = LiYeError('类型错误')
            print(e)
        
        
    17. try...except的方式比较if的方式的好处

      1. 改善代码容错性
      2. 增强程序鲁棒性
  • 相关阅读:
    CSS定位属性position相关介绍
    JavaScript 预解析机制
    使用 python 实现π的计算
    turtle库的学习
    关于使用MVVM模式在WPF的DataGrid控件中实现ComboBox编辑列
    关于wpf窗体中Allowtransparent和WindowsFormsHost的纠纷
    关于WPF中ItemsControl系列控件中Item不能继承父级的DataContext的解决办法
    Python简史
    敏捷开发原则
    线程池
  • 原文地址:https://www.cnblogs.com/zhangdadayou/p/11415380.html
Copyright © 2011-2022 走看看