• Python 3 基础之异常及其捕获


    异常

      异常是什么?

      当Python检测到一个错误时,解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的"异常"、

      也就是说不符合Python语法、与python语法有异的代码运行时会报错,这就是异常

    1、异常类型对照汇总:

    BaseException             所有异常的基类         
     +-- SystemExit              解释器请求退出
     +-- KeyboardInterrupt          用户中断执行(通常是输入^C)
     +-- GeneratorExit            生成器(generator)发生异常来通知退出
     +-- Exception               常规错误的基类
          +-- StopIteration              迭代器没有更多值 
          +-- StopAsyncIteration              必须通过异步迭代器对象的__anext__()方法引发以停止迭代
          +-- ArithmeticError                 所有数值计算错误的基类
          |    +-- FloatingPointError             浮点计算错误
          |    +-- OverflowError                  数值运算超出最大限制
          |    +-- ZeroDivisionError              除(或取模)零 (所有数据类型
          +-- AssertionError                  断言语句失败
          +-- AttributeError                  对象没有这个属性
          +-- BufferError                    与缓冲区相关的操作时引发
          +-- EOFError                        没有内建输入,到达EOF 标记
          +-- ImportError                     导入失败
          |    +-- ModuleNotFoundError        找不到模块
          +-- LookupError                     无效数据查询的基类
          |    +-- IndexError                      序列中没有此索引(index)
          |    +-- 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                   Python 语法错误
          |    +-- IndentationError         缩进错误
          |         +-- TabError          Tab 和空格混用
          +-- SystemError              一般的解释器系统错误
          +-- TypeError               对类型无效的操作
          +-- ValueError              传入无效的参数
          |    +-- UnicodeError             Unicode 相关的错误
          |         +-- UnicodeDecodeError     Unicode 解码时的错误
          |         +-- UnicodeEncodeError     Unicode 编码时错误
          |         +-- UnicodeTranslateError  Unicode 转换时错误
          +-- Warning                       警告的基类
               +-- DeprecationWarning          关于被弃用的特征的警告
               +-- PendingDeprecationWarning   关于构造将来语义会有改变的警告
               +-- RuntimeWarning           可疑的运行行为的警告
               +-- SyntaxWarning            可疑的语法的警告
               +-- UserWarning              用户代码生成的警告
               +-- FutureWarning            有关已弃用功能的警告的基类
               +-- ImportWarning            模块导入时可能出错的警告的基类
               +-- UnicodeWarning           与Unicode相关的警告的基类
               +-- BytesWarning             bytes和bytearray相关的警告的基类
               +-- ResourceWarning           与资源使用相关的警告的基类。。

    2、捕获异常

      捕获异常的书写格式:

    # 捕获异常的书写格式
    try
    : 执行可能发生异常的代码 except 异常类型(可以是多个): 如果发生异常执行的代码

      2.1、捕获单个异常

        单个异常捕获需要 except: 后面跟的异常类型与实际运行报异常的类型一致

    try:
        print(a)
    except NameError as N:
        print('捕获异常类型:%s' % N)

        try中的print(a) 代码执行异常,发生异常后运行except:里面的代码

      2.2、捕获多个异常

        多个捕获异常,需要把多个异常的类型找出来对应异常放在except后面,可以把要捕获的异常的名字,放到except 后,并使用元组的方式仅进行存储

    try:
        print(a)
        open('123.txt','r')
    except (NameError,FileNotFoundError) as N:
        print('捕获异常类型:%s' % N)

      2.3、获取异常信息的描述

        格式

    try:
        执行可能发生异常的代码
    excpet (异常类型1, 异常类型2, ....) as 临时变量名:
        可以获得临时变量名

        实例

    try:
        print(a)
        open('123.txt','r')
    except (NameError,FileNotFoundError) as N:
        # 当有多个异常信息时,只按顺序显示 一个
        print('捕获异常类型:%s' % N)

      2.4、捕获所有异常

        格式:

    try:
        执行可能发生异常的代码
    except Exception as 临时变量:
        发生异常执行的代码

        实例,同时获取所有捕获异常的信息描述:

    try:
        open("hm1.txt", "r")
    #Exception把python中所有异常兼容,是所有异常的父类
    except Exception as E:
    # except Exception:可以简写成 except:  意思是各种异常类型
        print("捕获到了异常:%s" % E)

      2.5、捕获异常中的else

        若没有捕获异常,执行else中的代码

    try:
        open("hm.txt", "r")
    except:
        # try中的代码发生了异常执行except代码
        print("except")
    else:
        # 如果try中的代码没有发生异常 就会执行else中的代码
        print("else")

      2.6、捕获异常的finally

       在程序中,如果一个段代码必须要执行,即无论异常是否产生都要执行,那么此时就需要使用finally。 比如文件关闭,释放锁,把数据库连接返还给连接池等

    try:
        open("hm.txt", "r")
    except:
        # try中的代码发生了异常执行except代码
        print("except")
    else:
        # 如果try中的代码没有发生异常 就会执行else中的代码
        print("else")
    finally:#无论try中的异常 代码是否发生异常,finally都会执行
        print('finally')

      demo:

    import time
    try:
        f = open('test.txt')
        try:
            while True:
                content = f.readline()
                if len(content) == 0:
                    break
                time.sleep(2)
                print(content)
        except:
            #如果在读取文件的过程中,产生了异常,那么就会捕获到
            #比如 按下了 ctrl+c
            pass
        finally:
            f.close()
            print('关闭文件')
    except:
        print("没有这个文件")

    3、异常的传递

      3.1、try嵌套

    import time
    try:
        f = open('test.txt')
        try:
            while True:
                content = f.readline()
                if len(content) == 0:
                    break
                time.sleep(2)
                print(content)
        except:
            #如果在读取文件的过程中,产生了异常,那么就会捕获到
            #比如 按下了 ctrl+c
            pass
        finally:
            f.close()
            print('关闭文件')
    except:
        print("没有这个文件")

      3.2、异常的传递

        def test1():
            print("----test1-1----")
            print(num)
            print("----test1-2----")
    
        def test2():
            print("----test2-1----")
            test1()
            print("----test2-2----")
    
        def test3():
            try:
                print("----test3-1----")
                test1()
                print("----test3-2----")
            except Exception as result:
                print("捕获到了异常,信息是:%s"%result)
    
            print("----test3-2----")
    
        test3()
        print("------华丽的分割线-----")
        test2()

      如果try嵌套,那么如果里面的try没有捕获到这个异常,那么外面的try会接收到这个异常,然后进行处理,如果外边的try依然没有捕获到,那么再进行传递。。。

      如果一个异常是在一个函数中产生的,例如函数A---->函数B---->函数C,而异常是在函数C中产生的,那么如果函数C中没有对这个异常进行处理,那么这个异常会传递到函数B中,如果函数B有异常处理那么就会按照函数B的处理方式进行执行;如果函数B也没有异常处理,那么这个异常会继续传递,以此类推。。。如果所有的函数都没有处理,那么此时就会进行异常的默认处理,即通常见到的那样

      当调用test3函数时,在test1函数内部产生了异常,此异常被传递到test3函数中完成了异常处理,而当异常处理完后,并没有返回到函数test1中进行执行,而是在函数test3中继续执行

  • 相关阅读:
    信息安全从业人员出路在哪里?
    内网渗透总结
    google hack使用集锦
    几十万学费总结出来的Ddos攻击防护经验!
    thinkPHP渗透之经验决定成败
    查找文件是否存在,文件属性、日期、大小;
    RS232/485通信方式 保存和加载时数据的处理
    memcpy(&pData[nDataLen],PROGDATA_FILE_FRAM,strlen(PROGDATA_FILE_FRAM)) ;
    #define BREAKIFTRUE( ret ) if( ( ret ) ) break;
    cp5200的一般步骤
  • 原文地址:https://www.cnblogs.com/will-wu/p/13268566.html
Copyright © 2020-2023  润新知