2022年 11月 5日

python3-异常

系列文章目录

文章目录

  • 系列文章目录
  • 一、异常的概念
  • 二、异常处理
  • 三、抛出异常和自定义异常类

一、异常的概念

异常就是程序运行过程中,会影响程序正常执行的事件。

比如,除数为0异常,运行1 / 0,就会在终端输出异常信息:

Traceback (most recent call last):
  File "/home/task.py", line 1, in <module>
    1 / 0
ZeroDivisionError: division by zero
  • 1
  • 2
  • 3
  • 4

异常信息包括三部分:

  • 定位信息:指出是哪个文件的哪一行代码抛出了异常,上面第2行异常信息就是定位信息;
  • 异常的类型:指出该异常属于哪一类,比如AttributeError试图访问一个对象没有的属性、IOError输入/输出异常,上面第4行中冒号前面的ZeroDivisionError就是异常的类型。
  • 异常描述:指出具体出现了什么异常。上面第4行中冒号后面的,就是异常描述。

二、异常处理

程序出现异常就会停止运行。为此,我们必须做一些处理,消除异常,让程序可以继续运行下去,增强程序的健壮性。

  • 异常处理:

    python有专门的语法来应对可能出现的异常,语法格式如下:

    try:
        有可能出现异常的代码
        
    except 异常类型1 as 别名:
        对该类型异常的处理措施
        
    except (异常类型2,异常类型3):
        对异常类型2或类型3的处理措施
    ……
    
    except Exception as 别名:
        对该类型异常的处理措施
    
    else:
        try中的代码没有发生异常时,所要执行的代码
        
    finally:
        不管有没有异常,都要执行的代码
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 异常类型后面的as 别名不是必须的,如果你需要使用异常类型这个信息(比如要保存到日志中),则要用这个语法。
    • try后面可以有0到n个except
    • try后面可以只有finally,但不能只有elseelse必须和except配合使用。
    • 第11行中的**Exception可以代表任何类型的异常**,它是所有异常类型的父类。
  • 异常的传递:

    当函数/方法执行出现异常,会将异常传递给 函数/方法 的调用一方,如果传递到主程序,仍然没有异常处理,程序才会被终止

三、抛出异常和自定义异常类

  • 抛出异常:

    在有些情况下,我们需要主动抛出异常。比如:提示用户输入密码,如果长度少于 8,抛出异常。

    抛出异常的语法为raise 异常类的实例对象

  • 举例:

    def input_password():
    
        pwd = input("请输入密码:")
    
        # 判断密码长度,如果长度 >= 8,返回用户输入的密码
        if len(pwd) >= 8:
            return pwd
    
        # 密码长度不够,需要抛出异常
        # 创建异常对象
        ex = Exception("密码长度不够")
    
        # 抛出异常对象
        raise ex
    
    try:
        user_pwd = input_password()
        print(user_pwd)
    except Exception as result:
        print("发现错误:%s" % result)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
  • 自定义异常类:

    在上面的例子中,我们只是简单的实例化了Exception类,然后抛出。我们也可以像下面这样自己定义异常类,然后抛出实例对象。

    自定义异常类必须继承Exception类:

    class InputError(Exception):
      '''当输出有误时,抛出此异常'''
    
      #自定义异常类型的初始化
      def __init__(self, value):
          self.value = value
    
      # 返回异常类对象的说明信息
      def __str__(self):
          return ("无效的输入")
      
    try:
      raise InputError(1) # 抛出 MyInputError 这个异常
    except InputError as err:
      print(err)
      # 打印:无效的输入
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    下一篇