• python学习笔记(六)——异常处理


    异常处理

    在 Python 中,通过两个重要的功能来处理程序在运行中出现的异常和错误。其一是本文提到的异常处理,其二是断言(Assertions)。

    python中,所有的异常均派生自 BaseException(所有异常的基类)类的实例,系统提供的异常类称为内置异常,它们可通过解释器或内置函数来生成。并且都会具有一个提示导致错误详细原因的“关联值”。 这可以是一个字符串或由多个信息项(例如一个错误码和一个解释错误的字符串)组成的元组。 关联值通常会作为参数被传递给异常类的构造器。

    1、常见的处理异常的方式:

    try:
        可能出错的代码块
    except 错误类型:
        异常处理语句
    
    除此之外,还有以下格式:
    1.try...except结构 异常处理结构中最常见也最基本的结构。
    2.try...except...else结构 带else子句的异常处理结构,如果没有异常则执行else语句。
    3.try...except...except...结构,多个except语句,同一段代码可能会抛出多个异常。
    4.try...except...finally结构,finally语句不论是否发生异常都会执行。
    
    2、使用 except 捕获异常

    一般我们在 try 语句中放入可能会发生异常的代码,一旦发生异常就会跳转至 except 语句处,与相应的错误类型进行匹配。在找到对应错误类型后,执行对应语句处理异常。

    Exception 类是常规错误的基类。
    a=10
    b=0
    
    try:
        r=a/b
        print("a/b="+r)
    except Exception as e:
        print("异常:除数为0")
    
    输出:
    异常:除数为0
    
    多重 except 捕获不同种类异常与else 和 finally 的使用。
    a=10
    b=0
    
    try:
        r=a//b
        print(r)
    except TypeError as e:
        print("这是:类型错误")
    except ZeroDivisionError:
        print("这是:0判断")
    else:				# 如果不发生错误,执行
        print("这是:else")
    finally:            # 无论是否发生错误,一定会执行
        print("这是:finally")
    
    输出:
    这是:0判断
    这是:finally
    

    3、自定义错误类型

    内置异常类可以被子类继承以定义新的异常。即我们可以从 Exception 类或它的某个子类派生出新的异常类型。

    # 自定义错误类型
    class Err(Exception):
        def __init__(self,msg):
            self.msg=msg
    
    try:
        raise Err("这是自定义错误") # 抛出异常,类似C++中的throw
    except Err as e:
        print(e)
    
    输出:
    这是自定义错误
    

    常见异常类型:

    以下内容一用自python3 官方开发文档 内置异常中的一部分,更多内容或是详情请参看 python 社区。 》点击这里:python 内置异常

    基类
    1. 下列异常主要被用作其他异常的基类。
    • exception BaseException
      所有内置异常的基类。 它不应该被用户自定义类直接继承 (这种情况请使用 Exception)。 如果在此类的实例上调用 str(),则会返回实例的参数表示,或者当没有参数时返回空字符串。
    • exception Exception
      所有内置的非系统退出类异常都派生自此类。 所有用户自定义异常也应当派生自此类。
    • exception ArithmeticError
      此基类用于派生针对各种算术类错误而引发的内置异常: OverflowError, ZeroDivisionError, FloatingPointError。
    • exception BufferError
      当与 缓冲区 相关的操作无法执行时将被引发。
    • exception LookupError
      此基类用于派生当映射或序列所使用的键或索引无效时引发的异常: IndexError, KeyError。 这可以通过 codecs.lookup() 来直接引发。
    具体异常:
    2.以下异常属于经常被引发的异常。
    • exception AssertionError
      当 assert 语句失败时将被引发。
    • exception AttributeError¶
      当属性引用 (参见 属性引用) 或赋值失败时将被引发。 (当一个对象根本不支持属性引用或属性赋值时则将引发 TypeError。)
    • exception EOFError
      当 input() 函数未读取任何数据即达到文件结束条件 (EOF) 时将被引发。 (另外,io.IOBase.read() 和 io.IOBase.readline() 方法在遇到 EOF 则将返回一个空字符串。)
    • exception ImportError
      当 import 语句尝试加载模块遇到麻烦时将被引发。 并且当 from … import 中的 “from list” 存在无法找到的名称时也会被引发。
    • exception ModuleNotFoundError
      ImportError 的子类,当一个模块无法被定位时将由 import 引发。 当在 sys.modules 中找到 None 时也会被引发。
    • exception IndexError
      当序列抽取超出范围时将被引发。 (切片索引会被静默截短到允许的范围;如果指定索引不是整数则 TypeError 会被引发。)
    • exception KeyError
      当在现有键集合中找不到指定的映射(字典)键时将被引发。
    • exception KeyboardInterrupt
      当用户按下中断键 (通常为 Control-C 或 Delete) 时将被引发。 在执行期间,会定期检测中断信号。 该异常继承自 BaseException 以确保不会被处理 Exception 的代码意外捕获,这样可以避免退出解释器。
    • exception MemoryError
      当一个操作耗尽内存但情况仍可(通过删除一些对象)进行挽救时将被引发。 关联的值是一个字符串,指明是哪种(内部)操作耗尽了内存。 请注意由于底层的内存管理架构(C 的 malloc() 函数),解释器也许并不总是能够从这种情况下完全恢复;但它毕竟可以引发一个异常,这样就能打印出栈回溯信息,以便找出导致问题的失控程序。
    • exception NameError
      当某个局部或全局名称未找到时将被引发。 此异常仅用于非限定名称。 关联的值是一条错误信息,其中包含未找到的名称。
    • exception OSError(errno, strerror[, filename[, winerror[, filename2]]])
      此异常在一个系统函数返回系统相关的错误时将被引发,此类错误包括 I/O 操作失败例如 “文件未找到” 或 “磁盘已满” 等(不包括非法参数类型或其他偶然性错误)。
    • exception SyntaxError
      当解析器遇到语法错误时将被引发。 这可以发生在 import 语句,对内置函数 exec() 或 eval() 的调用,或者读取原始脚本或标准输入(也包括交互模式)的时候。
    • exception IndentationError
      与不正确的缩进相关的语法错误的基类。 这是 SyntaxError 的一个子类。
    • exception TabError¶
      当缩进包含对制表符和空格符不一致的使用时将被引发。 这是 IndentationError 的一个子类。
    • exception TypeError¶
      当一个操作或函数被应用于类型不适当的对象时将被引发。 关联的值是一个字符串,给出有关类型不匹配的详情。
    • exception UnicodeError¶
      当发生与 Unicode 相关的编码或解码错误时将被引发。 此异常是 ValueError 的一个子类。
    • exception ValueError¶
      当操作或函数接收到具有正确类型但值不适合的参数,并且情况不能用更精确的异常例如 IndexError 来描述时将被引发。

    OS 异常
    下列异常均为 OSError 的子类,它们将根据系统错误代码被引发。

    • exception BlockingIOError¶
      当一个操作会被某个设置为非阻塞操作的对象(例如套接字)所阻塞时将被引发。 对应于 errno EAGAIN, EALREADY, EWOULDBLOCK 和 EINPROGRESS。
    • exception FileExistsError
      当试图创建一个已存在的文件或目录时将被引发。 对应于 errno EEXIST。
    • exception FileNotFoundError
      当所请求的文件或目录不存在时将被引发。 对应于 errno ENOENT。
    • exception InterruptedError
      当系统调用被输入信号中断时将被引发。 对应于 errno EINTR。
    • exception TimeoutError
      当一个系统函数发生系统级超时的情况下将被引发。 对应于 errno ETIMEDOUT
    警告
    3. 下列异常被用作警告类别;请参阅 警告类别 文档了解详情。
    • exception Warning
      警告类别的基类。
    • exception UserWarning
      用户代码所产生警告的基类。
    • xception SyntaxWarning
      与模糊的语法相关的警告的基类。
    • exception RuntimeWarning
      与模糊的运行时行为相关的警告的基类

    以上内容只列出部分,详情请参考 python 官方文档。


    附:
    内置异常:https://docs.python.org/zh-cn/3/library/exceptions.html?highlight=exception#Exception

  • 相关阅读:
    HTML学习基础(一)
    初识C#
    SQL小知识
    jQuery(四)
    jQuery(三)
    认识jQuery(二)
    认识Jquery
    初识Javascript
    初识HTML
    博客,你好!
  • 原文地址:https://www.cnblogs.com/TaoR320/p/12680106.html
Copyright © 2020-2023  润新知