zoukankan      html  css  js  c++  java
  • python_fullstack基础(十三)-异常处理

    异常处理

    一、异常和错误

    1、语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正)

    SyntaxError: invalid syntax

    2、逻辑错误(逻辑错误)

    二、python中的异常种类

    1、常见异常

    AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
    IOError 输入/输出异常;基本上是无法打开文件
    ImportError 无法引入模块或包;基本上是路径问题或名称错误
    IndentationError 语法错误(的子类) ;代码没有正确对齐
    IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
    KeyError 试图访问字典里不存在的键
    KeyboardInterrupt Ctrl+C被按下
    NameError 使用一个还未被赋予对象的变量
    TypeError 传入对象类型与要求的不符合
    UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它
    ValueError 传入一个调用者不期望的值,即使值的类型是正确的

    2、更多异常

    ArithmeticError :所有数值计算错误的基类
    AssertionError:断言语句失败
    AttributeError:对象没有这个属性
    BaseException:所有异常的基类
    BufferError:当无法执行缓冲区相关操作时引发
    BytesWarning:对于字节和字节数组警告相关的基类
    DeprecationWarning:关于被弃用的特征的警告
    EnvironmentError :操作系统错误的基类
    EOFError :没有内建输入,到达EOF 标记
    Exception:常规错误的基类
    FloatingPointError :浮点计算错误
    FutureWarning :关于构造将来语义会有改变的警告
    GeneratorExit :生成器(generator)发生异常来通知退出
    ImportError :导入模块/对象失败
    IndentationError:缩进错误
    IndexError:序列中没有此索引(index)
    IOError :输入/输出操作失败
    KeyboardInterrupt:用户中断执行(通常是输入^C)
    KeyError:映射中没有这个键
    LookupError :无效数据查询的基类
    MemoryError:内存溢出错误(对于Python 解释器不是致命的)
    NameError:未声明/初始化对象 (没有属性)
    NotImplementedError:尚未实现的方法
    OSError :操作系统错误
    OverflowError:数值运算超出最大限制
    OverflowWarning:旧的关于自动提升为长整型(long)的警告
    PendingDeprecationWarning:关于特性将会被废弃的警告
    ReferenceError:弱引用(Weak reference)试图访问已经垃圾回收了的对象
    RuntimeError :一般的运行时错误
    RuntimeWarning :可疑的运行时行为(runtime behavior)的警告
    StandardError:所有的内建标准异常的基类
    StopIteration :迭代器没有更多的值
    SyntaxError:Python 语法错误
    SyntaxWarning:可疑的语法的警告
    SystemError :一般的解释器系统错误
    SystemExit:解释器请求退出
    TabError:Tab 和空格混用
    TypeError:对类型无效的操作
    UnboundLocalError :访问未初始化的本地变量
    UnicodeDecodeError :Unicode 解码时的错误
    UnicodeEncodeError :Unicode 编码时错误
    UnicodeError :Unicode 相关的错误
    UnicodeTranslateError:Unicode 转换时错误
    UserWarning:用户代码生成的警告
    ValueError :传入无效的参数
    Warning :警告的基类
    WindowsError:系统调用失败
    ZeroDivisionError:除(或取模)零 (所有数据类型)

    3、异常的结构

    BaseException
     +-- SystemExit
     +-- KeyboardInterrupt
     +-- GeneratorExit
     +-- Exception
          +-- StopIteration
          +-- StandardError
          |    +-- BufferError
          |    +-- ArithmeticError
          |    |    +-- FloatingPointError
          |    |    +-- OverflowError
          |    |    +-- ZeroDivisionError
          |    +-- AssertionError
          |    +-- AttributeError
          |    +-- EnvironmentError
          |    |    +-- IOError
          |    |    +-- OSError
          |    |         +-- WindowsError (Windows)
          |    |         +-- VMSError (VMS)
          |    +-- EOFError
          |    +-- ImportError
          |    +-- LookupError
          |    |    +-- IndexError
          |    |    +-- KeyError
          |    +-- MemoryError
          |    +-- NameError
          |    |    +-- UnboundLocalError
          |    +-- ReferenceError
          |    +-- RuntimeError
          |    |    +-- NotImplementedError
          |    +-- SyntaxError
          |    |    +-- IndentationError
          |    |         +-- TabError
          |    +-- SystemError
          |    +-- TypeError
          |    +-- ValueError
          |         +-- UnicodeError
          |              +-- UnicodeDecodeError
          |              +-- UnicodeEncodeError
          |              +-- UnicodeTranslateError
          +-- Warning
               +-- DeprecationWarning
               +-- PendingDeprecationWarning
               +-- RuntimeWarning
               +-- SyntaxWarning
               +-- UserWarning
               +-- FutureWarning
           +-- ImportWarning
           +-- UnicodeWarning
           +-- BytesWarning

    三、异常处理

    1、异常的特点:异常发生之后,异常之后的代码就不执行了

    2、什么是异常处理

    python解释器检测到错误,触发异常(也允许程序员自己触发异常),程序员编写特定的代码,专门用来捕捉这个异常(这段代码与程序逻辑无关,与异常处理有关),如果捕捉成功则进入另外一个处理分支,执行你为其定制的逻辑,使程序不会崩溃,
    这就是异常处理

    3、异常处理的意义

    python解析器去执行程序,检测到了一个错误时,触发异常,异常触发后且没被处理的情况下,程序就在当前异常处终止,后面的代码不会运行,谁会去用一个运行着突然就崩溃的软件。所以你必须提供一种异常处理机制来增强你程序的健壮性与容错性。

    4、★异常处理方法:

    ①使用if进行异常处理
    总结:
    
    if判断式的异常处理只能针对某一段代码,对于不同的代码段的相同类型的错误你需要写重复的if来进行处理。
    在你的程序中频繁的写与程序本身无关,与异常处理有关的if,会使得你的代码可读性极其的差
    if是可以解决异常的,只是存在1,2的问题,所以,千万不要妄下定论if不能用来异常处理。
    ②python为每一种异常定制了一个类型,然后提供了一种特定的语法结构用来进行异常处理
    • part1:基本语法
    try:
         被检测的代码块
    except 异常类型:
         try中一旦检测到异常,就执行这个位置的逻辑
    • part2:异常类只能用来处理指定的异常情况,如果非指定异常则无法处理。
    # 未捕获到异常,程序直接报错
    s1 = 'hello'
    try:
        int(s1)
    except IndexError as e:
        print e
    • part3:多分支
    s1 = 'hello'
    try:
        int(s1)
    except IndexError as e:
        print(e)
    except KeyError as e:
        print(e)
    except ValueError as e:
        print(e)
    • part4:万能异常 在python的异常中,有一个万能异常:Exception,可以捕获任意异常
    s1 = 'hello'
    try:
        int(s1)
    except Exception as e:
        print(e)
    • part5:异常的其他语法
    s1 = 'hello'
    try:
        int(s1)
    except IndexError as e:
        print(e)
    except KeyError as e:
        print(e)
    except ValueError as e:
        print(e)
    #except Exception as e:
    #    print(e)
    else:
        print('try内代码块没有异常则执行我')
    finally:
        print('无论异常与否,都会执行该模块,通常是进行清理工作')
    • part6:主动触发异常
    try:
        raise TypeError('类型错误')
    except Exception as e:
        print(e)
    • part7:自定义异常
    class YangException(BaseException):
        def __init__(self,msg):
            self.msg=msg
        def __str__(self):
            return self.msg
    
    try:
        raise YangException('类型错误')
    except YangException as e:
        print(e)
    • part8:断言
    # assert 条件
    assert 1 == 1
    assert 1 == 2
    • part9:try..except的方式比较if的方式的好处

    • 使用try..except的方式:

      • 把错误处理和真正的工作分开来
      • 代码更易组织,更清晰,复杂的工作任务更容易实现;
      • 毫无疑问,更安全了,不至于由于一些小的疏忽而使程序意外崩溃了;
  • 相关阅读:
    git diff
    升级xcode10.0, 终端运行 运行报错:Print: Entry, “:CFBundleIdentifier”, Does Not Exist
    Xcode10.0: NO BUNDLE URL PRESENT
    Xcode10:The operation couldn’t be completed. (DVTCoreSimulatorAdditionsErrorDomain error 0.)
    Xcode 10 Error: Multiple commands produce
    Node.js 中 __dirname 和 ./ 的区别
    aplipay支付-app支付之前后端实现
    容联云短信接口使用
    CryptoJS中WordArray
    react-native布局中的层级问题(zIndex,elevation)
  • 原文地址:https://www.cnblogs.com/lidaxu/p/8321632.html
Copyright © 2011-2022 走看看