异常

目标

  • 异常的概念
  • 捕获异常
  • 异常的传递
  • 抛出异常
  • 01. 异常的概念

  • 程序在运行时,如果 Python 解释器 遇到 到一个错误,会停止程序的执行,并且提示一些错误信息,这就是 异常

  • 程序停止执行并且提示错误信息 这个动作,我们通常称之为:抛出(raise)异常

  • 常见异常

  • 异常类型 含义
    AssertionError assert 关键字后的条件为假时,程序运行会停止并抛出 AssertionError 异常
    AttributeError 当试图访问的对象属性不存在时抛出的异常
    IndexError 索引超出序列范围会引发此异常
    KeyError 字典中查找一个不存在的关键字时引发此异常
    NameError 尝试访问一个未声明的变量时,引发此异常
    TypeError 不同类型数据之间的无效操作
    ZeroDivisionError 除法运算中除数为 0 引发此异常

    程序开发时,很难将 所有的特殊情况 都处理的面面俱到,通过 异常捕获 可以针对突发事件做集中的处理,从而保证程序的 稳定性和健壮性

    当一个程序发生异常时,代表该程序在执行时出现了非正常的情况,无法再执行下去。默认情况下,程序是要终止的。如果要避免程序退出,可以使用捕获异常的方式获取这个异常的名称,再通过其他的逻辑代码让程序继续运行,这种根据异常做出的逻辑处理叫作异常处理。

    02. 捕获异常

  • 在实际开发中,为了能够处理复杂的异常情况,完整的异常语法如下:
  • try:
        # 尝试执行的代码
        pass
    except 错误类型1:
        # 针对错误类型1,对应的代码处理
        pass
    except 错误类型2:
        # 针对错误类型2,对应的代码处理
        pass
    except (错误类型3, 错误类型4):
        # 针对错误类型3 和 4,对应的代码处理
        pass
    except Exception as result:
        # 打印错误信息
        print(result)
    else:
        # 没有异常才会执行的代码
        pass
    finally:
        # 无论是否有异常,都会执行的代码
        print("无论是否有异常,都会执行的代码")
    
  • else 只有在没有异常时才会执行的代码
  • finally 无论是否有异常,都会执行的代码
  • 03. 异常的传递

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

  • 在开发中,可以在主函数中增加 异常捕获
  • 而在主函数中调用的其他函数,只要出现异常,都会传递到主函数的 异常捕获
  • 这样就不需要在代码中,增加大量的 异常捕获,能够保证代码的整洁
  • 04. 抛出 raise 异常

    4.1 应用场景

  • 在开发中,除了 代码执行出错 Python 解释器会 抛出 异常之外
  • 还可以根据 应用程序 特有的业务需求 主动抛出异常
  • 4.2 基本语法格式

    raise 语句的基本语法格式为:

    raise [exceptionName [(reason)]]

    其中,用 [] 括起来的为可选参数,其作用是指定抛出的异常名称,以及异常信息的相关描述。如果可选参数全部省略,则 raise 会把当前错误原样抛出;如果仅省略 (reason),则在抛出异常时,将不附带任何的异常描述信息。

    也就是说,raise 语句有如下三种常用的用法:

    1. raise:单独一个 raise。该语句引发当前上下文中捕获的异常(比如在 except 块中),或默认引发 RuntimeError 异常。
    2. raise 异常类名称:raise 后带一个异常类名称,表示引发执行类型的异常。
    3. raise 异常类名称(描述信息):在引发指定类型的异常的同时,附带异常的描述信息。

    显然,每次执行 raise 语句,都只能引发一次执行的异常。首先,我们来测试一下以上 3 种 raise 的用法:

    >>> raise
    Traceback (most recent call last):
      File "<pyshell#1>", line 1, in <module>
        raise
    RuntimeError: No active exception to reraise
    >>> raise ZeroDivisionError
    Traceback (most recent call last):
      File "<pyshell#0>", line 1, in <module>
        raise ZeroDivisionError
    ZeroDivisionError
    >>> raise ZeroDivisionError("除数不能为零")
    Traceback (most recent call last):
      File "<pyshell#2>", line 1, in <module>
        raise ZeroDivisionError("除数不能为零")
    ZeroDivisionError: 除数不能为零
    

    当然,我们手动让程序引发异常,很多时候并不是为了让其崩溃。事实上,raise 语句引发的异常通常用 try except(else finally)异常处理结构来捕获并进行处理。例如:

    try:
        a = input("输入一个数:")
        #判断用户输入的是否为数字
        if(not a.isdigit()):
            raise ValueError("a 必须是数字")
    except ValueError as e:
        print("引发异常:",repr(e))
    

    程序运行结果为:

    输入一个数:a
    引发异常: ValueError('a 必须是数字',)
    

    内容学习:

    1. 黑马程序员
    2. http://c.biancheng.net/view/4593.html
    3. http://c.biancheng.net/view/2360.html

    来源:Fighting_1997

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python 捕获异常

    发表评论