异常处理

由问题引发的异常

程序运行过程中,可能会因为数据使用不当导致程序运行出现了错误,引发程序崩溃退出。
所有可能导致程序运行不正常的行为,都称为程序中的异常行为,简称异常

程序中的异常行为,主要由两类:

  1. 语法拼写错误:不符合语法规则的拼写,导致程序直接报错;但是这样的错误过于明显,所以不称为异常,直接称为错误!
  2. 语法规则正确:程序运行期间,由于误操作或者不合法的数据导致程序中的代码报错,这样的报错行为一般情况下称为异常!
  3. 语法规则正确:程序运行期间没有任何错误,但是运行的结果不符合预期,这样的程序运行逻辑出现的问题不称为异常,而是称为 BUG(缺陷)。如:计算两个数字的和,输入11,12,得到了1112

python中都有什么异常

python语法中提供了自己的异常体系,可以很方便的描述大部分情况下遇到的各种异常情况,所有的异常都是从 BaseException 直接或者间接继承而来的!

BaseException
 +-- SystemExit
 +-- KeyboardInterrupt
 +-- GeneratorExit
 +-- Exception
      +-- StopIteration
      +-- StopAsyncIteration
      +-- ArithmeticError
      |    +-- FloatingPointError
      |    +-- OverflowError
      |    +-- ZeroDivisionError
      +-- AssertionError
      +-- AttributeError
      +-- BufferError
      +-- EOFError
      +-- ImportError
      |    +-- ModuleNotFoundError
      +-- LookupError
      |    +-- IndexError
      |    +-- KeyError
      +-- MemoryError
      +-- NameError
      |    +-- UnboundLocalError
      +-- OSError
      |    +-- BlockingIOError
      |    +-- ChildProcessError
      |    +-- ConnectionError
      |    |    +-- BrokenPipeError
      |    |    +-- ConnectionAbortedError
      |    |    +-- ConnectionRefusedError
      |    |    +-- ConnectionResetError
      |    +-- FileExistsError
      |    +-- FileNotFoundError
      |    +-- InterruptedError
      |    +-- IsADirectoryError
      |    +-- NotADirectoryError
      |    +-- PermissionError
      |    +-- ProcessLookupError
      |    +-- TimeoutError
      +-- ReferenceError
      +-- RuntimeError
      |    +-- NotImplementedError
      |    +-- RecursionError
      +-- SyntaxError
      |    +-- IndentationError
      |         +-- TabError
      +-- SystemError
      +-- TypeError
      +-- ValueError
      |    +-- UnicodeError
      |         +-- UnicodeDecodeError
      |         +-- UnicodeEncodeError
      |         +-- UnicodeTranslateError
      +-- Warning
           +-- DeprecationWarning
           +-- PendingDeprecationWarning
           +-- RuntimeWarning
           +-- SyntaxWarning
           +-- UserWarning
           +-- FutureWarning
           +-- ImportWarning
           +-- UnicodeWarning
           +-- BytesWarning
           +-- ResourceWarning

什么是异常?
异常是程序中的所有不正常的行为,导致程序报错乃至崩溃退出的错误。
常见的异常(广义)按照报错情况分为两种:错误[语法错误]异常[运行异常,侠义]

python中的异常体系
通过语法规则,给程序中所有的不正常行为进行命名,方便精确处理,如下标越界异常,类型转换异常等等。python 语法规则中定义了异常的超类(BaseException),让所有可能发生的各种异常直接或者间接继承自该类型,方便所有异常的统一管理。

异常处理的基本语法

Python针对异常体系,提供了标准的,固定的处理语法

try:
    可能出现异常的代码块
except 具体异常 as e:
    处理异常的代码
[else]:
    未出现异常时执行的代码块
[finally]:
    不论是否出现异常,都会执行的代码块

处理单个异常

try:
    # 当用户误操作输入非数字时可能触发 ValueError
    pay = float(input("请输入支付金额:"))
    print(f"用户支付了{pay}元")
except ValueError as e:
    print("出现了异常")
    print("您的输入有误!")

处理多个异常

多个 try…except 语句

try:
    pay = float(input("请输入支付金额:"))
    prinf("hello")
except ValueError as e:
    print("您的输入有误")

try:
    pay = float(input("请输入支付金额:"))
    prinf("hello")
except NameError as e:
    print("prinf is not defined")

堆叠 except语句

try:
    pay = float(input("请输入支付金额:"))
    prinf("hello")
except ValueError as e:
    print("您的输入有误")
except NameError as e:
    print("prinf is not defined")

模糊处理多个异常

try:
    pay = float(input("请输入支付金额:"))
    prinf("hello")
except (ValueError,NameError) as e:
    print("上述出现了异常!")

处理所有异常

由于所有的异常都是直接或者间接继承自 BaseException,所以可以通过处理定义顶级异常类 BaseException 完成所有异常的处理

try:
    可能出现异常的代码块
except BaseException as e:
    print("发生异常,", e)

简化语法

try:
    可能出现异常的代码块
except:
    print("出现了异常")

自定义异常和抛出异常

项目开发过程中,由于项目场景千变万化,python中提供的异常体系并不能完全描述项目中可能出现的所有异常,我们就需要对系统中的异常进行扩展

自定义异常

自定义异常类,继承自 BaseException,异常类的名称和项目中业务逻辑紧密相关

class UserInputError(BaseException):
    def __init__(self):
        self.msg = "用户输入了错误的选项"
    
    def __str__(self):
        return self.msg

**自定义异常的作用:**将系统中的异常信息,转换为和业务逻辑紧密相关的异常信息。
**异常的数据转换:**需要在出现异常的地方,将自定义异常抛出给调用者!

抛出异常

基本语法: raise 异常对象

try:
    pay = float(input("请输入支付金额:"))
except ValueError as e:
    # 抛出自定义异常对象
    raise UserInputError()

# 执行结果
# UserInputError: 用户输入了错误的选项

抛出自定义异常,实现了异常信息的转换过程,给用户一个更加明确的异常信息!