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")

  返回结果如下:

    

原文地址:https://www.cnblogs.com/bugoobird/p/12970197.html