• (12)python异常处理,python中的 try except


    【1】基本形式

    【1.0】一般形式

    try:
        正文代码块1...
        正文代码块2...
        正文代码块3...
    except 具体错误类别 as e:  # e为错误的具体信息变量
        print("该类错误信息为",e)
    except Exception as e:   # Exception 为所有错误类别,但缩进、语法等错误无法捕捉,因为那属于编译错误,只能肉眼排查
        print("出错了,错误信息是:",e)
    else:      # 如果 try 代码块没有异常错误,则会执行该模块
        正文代码块4...
    finally:   # 无论是否报错,该代码块也会执行
        print("try except 代码块执行完毕")

    案例

    names = ['张三','李四']
    data = {}
    try:
        a = 1
    except (KeyError,IndexError) as e:
        print("Key没有找到,或者下标异常错误:",e)
    except IndexError as e:
        print("List 操作错误",e)
    except Exception as e:
        print("未知错误",e)
    else:
        print("如果没有异常发生,那么会执行我这个else,一切正常")
    finally:
        print("不管报不报错,我这个finally 还是要执行的")

    【1.1】错误信息

    names = ['张三','李四']
    data = {}
    names[3]

    File "D:/test.py", line 4, in <module>
    names[3]
    IndexError: list index out of range

    names = ['张三','李四']
    data = {}
    data['name']

    File "D:/郭超群/学习/python/project/学习笔记/第7周_反射_错误处理_网络编程/test.py", line 5, in <module>
    data['name']
    KeyError: 'name'

    总结:

      我们可以发现,不同情况,有不同类别的错误

    【1.2】try except 错误捕捉基本形式(常用)

    names = ['张三','李四']
    data = {}
    try:
        names[3]
    except KeyError as e:
        print("没有这个Key",e)
    except IndexError as e:
        print("List 操作错误",e)

    输出:

      List 操作错误 list index out of range

    try:
        data['a']
    except KeyError as e:
        print("没有这个Key",e)
    except IndexError as e:
        print("List 操作错误",e)

    输出:

      没有这个Key 'a'

    【1.3】一个  except 包含多种错误类型捕获

    通常用在,发生不同错误,但都用同一种错误处理方式

    names = ['张三','李四']
    data = {}
    try:
        data['a']
    except (KeyError,IndexError) as e:
        print("Key没有找到,或者下标异常错误:",e)

    输出:

      Key没有找到,或者下标异常错误: 'a'

    【1.4】捕获所有错误(except exception)

    这个不常用,因为无法精准定位是什么类型

    names = ['张三','李四']
    data = {}
    try:
        data['a']
    except Exception as e:
        print("出错了:", e)

    输出:

      出错了: 'a'

    【1.5】try except else finally

    names = ['张三','李四']
    data = {}
    try:
        a = 1
    except (KeyError,IndexError) as e:
        print("Key没有找到,或者下标异常错误:",e)
    except IndexError as e:
        print("List 操作错误",e)
    except Exception as e:
        print("未知错误",e)
    else:
        print("如果没有异常发生,那么会执行我这个else,一切正常")
    finally:
        print("不管报不报错,我这个finally 还是要执行的")

    【2】常用异常类型

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

    【3】自定义错误抛出 raise

    class DiyException(Exception):
        def __init__(self, msg):
            self.msg = msg
    
        def __str__(self):    # 这个方法可以不写,详情见下面分析
            return self.msg
    
    
    try:
        raise DiyException("我的Diy异常!")
    except DiyException as e:
        print("异常错误信息为:", e)

    输出:

      异常错误信息为: 我的Diy异常!

    分析:

      我们这里可以看到有一个 __str__ 函数,他的作用是,但打印该类的时候,就返回它中 return 的值

      如果没有写这个函数,那么则以元组形式,返回所有 __init__ 里面的输入入参,如果只有一个参数则输出形式为字符串,如下图

        

     如果写了个和系统错误类别一样的自定义错误类,那么则会覆盖

  • 相关阅读:
    python 全栈开发,Day43(python全栈11期月考题)
    python 全栈开发,Day43(引子,协程介绍,Greenlet模块,Gevent模块,Gevent之同步与异步)
    python 全栈开发,Day42(Thread类的其他方法,同步锁,死锁与递归锁,信号量,事件,条件,定时器,队列,Python标准模块--concurrent.futures)
    python 全栈开发,Day41(线程概念,线程的特点,进程和线程的关系,线程和python 理论知识,线程的创建)
    python 全栈开发,Day40(进程间通信(队列和管道),进程间的数据共享Manager,进程池Pool)
    python 全栈开发,Day39(进程同步控制(锁,信号量,事件),进程间通信(队列,生产者消费者模型))
    python 全栈开发,Day38(在python程序中的进程操作,multiprocess.Process模块)
    python 全栈开发,Day37(操作系统的发展史)
    python 全栈开发,Day36(作业讲解(大文件下载以及进度条展示),socket的更多方法介绍,验证客户端链接的合法性hmac,socketserver)
    python 全栈开发,Day35(TCP协议 粘包现象 和解决方案)
  • 原文地址:https://www.cnblogs.com/gered/p/14060224.html
Copyright © 2020-2023  润新知