zoukankan      html  css  js  c++  java
  • python3之错误和异常

    一、语法错误

    程序运行过程出现的错误,包括语法上的错误和执行上的错误(通常是异常)

    语法错误又称解析错误,可能是在学习Python时最容易遇到的错误
    Python解析器会打印出错误的行,并在错误行中错误位置显示一个下标箭头

    二、异常

    语句或表达式在语法上是正确的,执行时引发错误称为异常
    异常不一定会导致严重后果,大多数的异常都不会被程序处理,程序终止并显示异常错误信息

    1 内置异常层次结构

    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

    2 基类内置异常

    BaseException
    所有内置异常的基类,不能被用户定义的异常直接继承
    
    Exception
    所有内置的非系统退出异常都派生自此类,所有用户定义的异常也应从此类派生
    
    ArithmeticError
    所有算术类错误而引发的内置异常都派生自此类: OverflowError, ZeroDivisionError, FloatingPointError
    
    BufferError
    与缓冲区相关的操作无法执行时将被引发
    
    LookupError
    用于派生当映射或序列所使用的键或索引无效时引发的异常: IndexError, KeyError

    3 常用的具体内置异常

    AssertionError
    assert语句条件为False时引发
    
    AttributeError
    属性引用或赋值失败时引发
    
    EOFError
    当input()函数达到文件结束条件(EOF)而没有读取任何数据时引发
    
    ImportError
    当import语句导入模块失败时引发
    
    ModuleNotFoundError
    找不到模块时引发
    
    IndexError 
    序列索引超出范围时引发
    
    KeyError
    找不到key时引发
    
    KeyboardInterrupt
    用户按下中断键(通常为Control-C或 Delete)时引发
    
    MemoryError
    内存不足时引发
    
    NameError
    使用未声明的变量时引发 
    
    StopIteration
    内置函数next()和迭代器的 __next__()方法,迭代器迭代完引发
    
    SyntaxError
    语法错误时引发
    
    TabError
    缩进混合使用空格和制表符时引发
    
    TypeError
    参数类型不支持当前操作时引发
    
    ValueError
    参数类型正确但值不合适时引发,即参数值无效
    
    ZeroDivisionError
    分母为0时引发

    4 OSError异常的子类

    BlockingIOError
    将堵塞对象设置为费堵塞时引发
    
    ChildProcessError
    子进程上的操作失败时引发
    
    ConnectionError
    连接相关问题的基类
    
    BrokenPipeError
    ConnectionError的子类,在已关闭写入的套接字上写入
    
    ConnectionAbortedError
    ConnectionError的子类,连接尝试被对等方中止
    
    ConnectionRefusedError
    ConnectionError的子类,连接尝试被对等方拒绝
    
    ConnectionResetError
    ConnectionError的子类,连接由对等方重置
    
    FileExistsError
    创建文件或目录已存在时引发
    
    FileNotFoundError
    请求文件或目录不存在时引发
    
    InterruptedError
    系统调用被输入信号中断时引发
    
    IsADirectoryError
    在目录上请求文件操作时引发
    
    NotADirectoryError
    在非目录上请求目录操作时引发
    
    PermissionError
    没有访问权限时引发
    
    ProcessLookupError
    进程不存在时引发
    
    TimeoutError
    系统函数在系统级别超时时引发

    三、异常捕捉处理

    1 try...except

    格式

    try:
        代码块
    except 内置异常类型1:
        发生异常时执行的代码块
    except 内置异常类型2:
        发生异常时执行的代码块    
    ...
    
    except Exception:
         ...
    
    其中
    一个try语句可以有多个except语句,多个except语句处理不同的异常类型,但最多只会执行一个except语句
    except后面异常类型可以有多个,以逗号隔开,如except (ValueError,IndexError.ArithmeticError)
    多个except语句捕捉异常时的顺序: 应按子类异常在前,父类异常在后,即先小异常后大异常

    示例

    ef divisi_1(a,b):
        return int(a)/int(b)
    
    try:
        print(divisi_1('2',2))
        #引发ValueError错误
        print(divisi_1('A',2))
    except ValueError:
        print("参数值无效,数学运算只接受数字")
    except ArithmeticError:
        print("算数错误")
    except Exception:
        print("未知错误")
    
    
    def divisi_2(a,b):
        return int(a)/int(b)
    
    try:
        print(divisi_2('2',2))
        #引发ArithmeticError错误
        print(divisi_2(2,0))
    except ValueError:
        print("参数值无效,数学运算只接受数字")
    except ArithmeticError:
        print("算数错误")
    except Exception:
        print("未知错误")

    2 else块

    当try块执行未出现异常时执行,else块可选

    示例

    def divisi(a,b):
        return int(a)/int(b)
    
    try:
        print(divisi('2',2))
    except ValueError:
        print("参数值无效,数学运算只接受数字")
    except ArithmeticError:
        print("算数错误")
    except Exception:
        print("未知错误")   
    else:
        print("try块未引发任何异常")  

    3 finally块

    无论是否发生异常都被执行,常用于清理操作

    以下情况需要注意

    A.如果try块的异常没有被except块捕获,则该异常会在finally块执行之后被重新引发
    B.如果except或else块引发异常, 则该异常会在finally块执行之后被重新引发
    C.如果try块时有 break, continuereturn 语句,则finally块将在执行 break, continuereturn 语句之前被执行
    D.如果 finally 子句中包含一个 return 语句,则返回值将来自 finally 块的某个 return 语句的返回值,而非来自其它块的 return 语句返回值

    示例

    def divisi(a,b):
        return int(a)/int(b)
    
    try:
        #引发ValueError错误
        print(divisi('A',2))
    except ValueError:
        print("参数值无效,数学运算只接受数字")
    except ArithmeticError:
        print("算数错误")
    except Exception:
        print("未知错误")   
    else:
        print("try块未引发任何异常") 
    finally:
        print("始终执行的finally块")

    4 完整的异常捕捉处理语法格式

    格式

    try:
        代码块
    except 内置异常类型1:
        发生异常时执行的代码块
    except 内置异常类型2:
        发生异常时执行的代码块    
    ...
    
    except Exception:
         ...
    else:
        未发生异常的代码块
    finally:
        清理操作代码块
    
    
    其中
    A.try块必须要有
    B.except,finally块至少包含一个
    C.else块可以没有
    D.finally块必须在所有except块之后
    E.多个except块,子类异常必须在父类异常之前

    四、自行引发异常

    除了系统自动引发异常,也可以自行引发异常
    python对自行引发的异常和系统自动引发的异常同样的处理

    示例

    def compare(a,b):
        if a > b:
            raise Exception("a不能大于b,a=%s,b=%s"% (a,b))
        else:
            print("%s>%s"%(b,a))
    
    try:
        compare(5,4)
    except Exception as E:
        print(E.args)
        print("自行引发的Exception异常!")
    else:
        print("try块未引发任何异常!")
    finally:
        print("始终执行的finally块!")
  • 相关阅读:
    css flex布局实现后台页面
    html5 css iframe实现后台框架,仅用于学习案例
    nginx 多个网站配置
    nginx 负载 访问时 去掉端口
    nginx 负载
    解标准数独算法
    C++ execute linux cmd and retrieve the output
    C++ generate in Ubuntu
    shell操作典型案例--FTP操作
    PHP7 新写法
  • 原文地址:https://www.cnblogs.com/gudanaimei/p/13463765.html
Copyright © 2011-2022 走看看