Python之面向对象异常处理

Posted zhangdadayou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python之面向对象异常处理相关的知识,希望对你有一定的参考价值。

6.10 异常处理

  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. 增强程序鲁棒性

以上是关于Python之面向对象异常处理的主要内容,如果未能解决你的问题,请参考以下文章

Python之面向对象异常处理

Python_day8_面向对象(多态成员修饰符类中特殊方法对象边缘知识)异常处理之篇

文成小盆友python-num8 面向对象中的成员,成员修饰符,特殊成员,异常处理,设计模式之单例模式

Java面向对象之异常详解

Java面向对象之异常(异常处理方式)

python 面向对象专题:异常处理