凄凄不似向前声,满座重闻皆掩泣——python异常处理

凄凄不似向前声,满座重闻皆掩泣
座中泣下谁最多?江州司马青衫湿

1 python的异常体系

异常一般指程序运行时由于出现非法数据导致的程序崩溃的行为

如在python当中有以下异常(只简单列举几个,具体见官方文档:https://docs.python.org/zh-cn/3/library/exceptions.html):

  • NameError:一般是没有声明就使用变量引起的
  • KeyError:一般是操作字典/列表选择的key数据或者编号数据有误引起的
  • IndexError:一般是操作列表时索引编号使用不当引起的
  • ValueError:一般是数据操作有误引起的如数据类型转换
  • KeyboardInterupt:一般是由于用户通过键盘终止程序引起的

BaseException和Exception:

  • BaseException:

  所有异常的直接或者间接父类

  • Exception:

  所有运行异常的直接或者间接父类(除了 SystemExit 、 KeyboardInterrupt 和 GeneratorExit 之外的所有异常)

2 异常处理

try:  # 必须
    可能出现异常的代码块,出现异常就会直接跳到except语句的代码中,之间的代码不会执行
except 可能出现的异常 as e:  # 必须
    处理异常的代码
else:  # 可不写,用于将可能执行异常代码和不会出现异常点代码分开,提高可读性
    代码执行没有异常执行这里的代码,没有异常才会执行
finally:  # 可不写
    程序运行到最后不论是否出现异常都要执行的代码,用于资源回收

2.1 处理单个异常

try:
    int("凄凄不似向前声")
except ValueError as e:
    print("该类型不能转换为int")  # 该类型不能转换为int

2.2 处理多个异常

精确处理(异常较重要需要单独处理):

try:
    int("凄凄不似向前声")
    print(a)
except ValueError as e:
    print("该类型不能转换为int")  # 该类型不能转换为int
except NameError as e:
    print("没有定义变量a")
else:
    print("满座重闻皆掩泣")
finally:
    print("运行完毕")

直接处理(什么异常不是关注点,需要保证程序正常运行):

try:
    print(a)
except (ValueError, NameError) as e:
    print("发生异常", e)  # 发生异常 name 'a' is not defined
else:
    print("满座重闻皆掩泣")
finally:
    print("运行完毕")

2.3 处理所有异常

try:
    print(a)
except BaseException as e:  # BaseException或Exception,也可以只写except:
    print("发生异常") 
else:
    print("满座重闻皆掩泣")
finally:
    print("运行完毕")

3 抛出异常

主动抛出异常:程序中一种异常/错误转移的语法方式,让程序主动报错

直接报错使程序停止:

num = input("请输入1:")
if num == "1":
    print("座中泣下谁最多?江州司马青衫湿")
else:
    raise Exception("输入错误")

自定义异常并处理,使程序正常运行:

try:
    num = input("请输入1:")
    if num == "1":
        print("座中泣下谁最多?江州司马青衫湿")
    else:
        raise Exception("输入错误")
except Exception as e:
    print(e)  # 输入错误

4 自定义异常

某些时候python中的异常体系不足以准确的描述可能出现的异常信息,就需要自定义异常,可使用创建对象的方法

class CustomError(Exception):
    """自定义异常"""
    def __init__(self, msg):  # 因为继承了Exception,也可以不写,根据需求而定
        super().__init__(msg)


num = input("请输入1:")
if num == "1":
    print("座中泣下谁最多?江州司马青衫湿")
else:
    print("请正确输入")
    raise CustomError("Error")  # 相较于Exception,可更明确错误的类型名称

你可能感兴趣的:(python基础)