• Python学习笔记(23)异常处理机制与日志模块


    一、出现异常

      比如在list和字典中,出现索引值超出list范围,或者字典的key不存在时,代码就会卡住不会继续往下面走 ,这时候需要对出现异常进行处理

      如图所示为异常:

      

           

    二、处理异常

    l = [ 1,2,3]
    d = {}
    try:
        print(l[4])
        # print(d['name'])
    except IndexError as e:#当捕捉到哪种异常,就走回哪种异常处理
        print("下标不存在")
        print(e)
    except KeyError as e:
        print("key不存在")
        print(e)
    
    
    #实际情况下,会预知到会出现异常,但无法确定哪种异常,可使用Exception捕捉
    try:
        print(l[4])
        # print(d['name'])
    except Exception as e:#当捕捉到哪种异常,就走回哪种异常处理
        print("出现异常")
    
    #异常的其他语句
    l = [ 1,2,3]
    d = {}
    
    try:
        print(l[4])
        # print(d['name'])
    except Exception as e:
        print("出异常了",e)
    else:#不出现异常时走else语句
        print("不出异常的时候走到这里")
    finally:#无论是否出现异常,都会走一次finally代码
        print("什么时候走这里呢")
    

      

      如上图所示,出现了两种异常,可使用try....except   xxxx  as e 来处理

      

    二、使用异常的实例

      由于函数的入参存在传入入参不规范的情况,代码需要对可能出现的异常场景进行处理,防止因为外部因素问题,导致函数内部代码出错,导致被调用的函数无法继续执行

      关于一个连接数据库的异常处理:

      

    # import pymysql
    # mysql_info = {
    #     'host':'***.**.**.**',
    #     'port':3306,
    #     'db':'**',
    #     'password':'******',
    #     'charset':'utf8',
    #     'autocommit':True,
    #     'user':'***'
    # }
    # def op_db(sql,one_tag=True):
    #     try:
    #         connect = pymysql.connect(**mysql_info)#**后加字典,表示key=value格式
    #     except Exception as e:
    #         return "001"
    #     else:
    #         cur = connect.cursor(pymysql.cursors.DictCursor)
    #         try:
    #             cur.execute(sql)
    #         except Exception as e:
    #             return "002"
    #         else:
    #             if one_tag:
    #                 result = cur.fetchone()#{}
    #             else:
    #                 result = cur.fetchall()#[]
    #         finally:#在连接数据后无论是否出现异常均需要关闭游标和连接
    #             cur.close()
    #             connect.close()
    #     return result
    

      

     三、日志模块(nnlog模块)
       在开发工作中,经常需要打印日志来进行代码调试和定位问题,本次采用nnlog模块来打印日志 

       日志级别:

       info:打印所有详细信息,最低级别

       debug:一般只用来测试环境中调试代码

       warning:警告,一般用于提示警告信息

       error:最高级别,只打印出错的error信息

        

    #nnlog模块基本用法
    import nnlog
    log = nnlog.Logger('python.log')
    log.warning("xxxx")
    log.info("xxx")
    log.debug("xxxx")
    log.error("xxxx")
    

      效果:

    使用nnlog日志模块实例:

    # import pymysql
    # import nnlog#引用日志模块
    # import traceback#获取系统报错日志模块
    # log = nnlog.Logger('python.log',level='debug',backCount=5,when='D')#日志输出为python.log文件,级别为debug,最多保留5个日志超过5天的自动覆盖掉,每天产生日志
    # mysql_info = {
    #     'host':'****',
    #     'port':3306,
    #     'db':'***',
    #     'password':'****',
    #     'charset':'utf8',
    #     'autocommit':True,
    #     'user':'***'
    # }
    # def op_db(sql,one_tag=True):
    #     try:
    #         log.debug("开始连接数据库,数据库连接信息是%s"%mysql_info)
    #         connect = pymysql.connect(**mysql_info)
    #     except Exception as e:
    #         log.debug("连接数据失败")
    #         log.error("连接数据失败,请检查")
    #         log.error(traceback.format_exc())
    #         # traceback.format_exc()拿到出错的那一大坨字符串
    #         #traceback.print_exc()#只print错误信息
    #         return "001"
    #     else:
    #         log.debug("开始建立游标")
    #         cur = connect.cursor(pymysql.cursors.DictCursor)
    #         try:
    #             log.debug("开始执行sql")
    #             log.info("sql语句是%s"%sql)
    #             cur.execute(sql)
    #         except Exception as e:
    #             log.warning("sql错误!")
    #             return "002"
    #         else:
    #             if one_tag:
    #                 result = cur.fetchone()#{}
    #             else:
    #                 result = cur.fetchall()#[]
    #         finally:
    #             cur.close()
    #             connect.close()
    #     return result
    # op_db("sql")

      返回结果如下:

        

  • 相关阅读:
    浅析Scrapy框架运行的基本流程
    排序和搜索
    设计模式:桥接模式及代码示例、桥接模式在jdbc中的体现、注意事项
    设计模式:适配器模式(类适配器、对象适配器、接口适配器)
    设计模式:建造者模式及在jdk中的体现,建造者模式和工厂模式区别
    java的线程、创建线程的 3 种方式、静态代理模式、Lambda表达式简化线程
    设计模式:原型模式介绍 && 原型模式的深拷贝问题
    设计模式:工厂设计模式介绍及3种写法(简单工厂、工厂方法、抽象工厂)
    设计模式:单例模式介绍及8种写法(饿汉式、懒汉式、Double-Check、静态内部类、枚举)
    设计模式七大原则及代码示例
  • 原文地址:https://www.cnblogs.com/bugoobird/p/12970197.html
Copyright © 2020-2023  润新知