异常、JSON与装饰器

异常、JSON与装饰器

一、异常处理

  • 在连接到MySQL数据库的过程中,如果不有效的处理异常,则异常信息过于复杂,对于用户不太友好,且暴露敏感信息。所以,程序必须有效的处理和控制异常,按照既定的流程执行:

    import pymysql
    
    try:
      conn=pymysql.connect(host='localhost',user='root',password='123456',database='lenarn',charset='utf8')
      print("连接到数据库成功")
      sql = "select username,password,role from user where userid<6"
    sursor.execute(sql)
      print("连接到数据库成功")
    except:
    print("连接到数据库失败")   
  • 更完整的异常处理:

    # try...except...finally...
    import pymysql
    
    try:
      conn=pymysql.connect(host='localhost',user='root',password='123456',database='lenarn',charset='utf8')
      print("连接到数据库成功")
      sql = "select username,password,role from user where userid<6"
    sursor.execute(sql)
    except:
    print("连接到数据库失败")   
    finally:
      conn.close()          # 无论成功与否,本代码都会执行,数据库连接关闭
  • 针对不同的异常,显示不同的错误提示

    import pymysql
    
    try:
      conn=pymysql.connect(host='localhost',user='root',password='123456',database='lenarn',charset='utf8')
      print("连接到数据库成功")
      sql = "select username,password,role from user where userid<6"
    sursor.execute(sql)
    except pymysql.err.OperationalError as e:
    print(e)  
    except pymysql.err.ProgrammingError as e:
      print(e)
    except Exception as e:
      print("代码存在其他异常")
    finally:
      conn.close() 
  • 主动抛出异常,让程序停止

    raise Exception("数据库处理出错")

二、JSON处理

  • 将python对象序列化成字符串

    import json
    from exercise.commen import query_mysql
    result = query_mysql("select username,password,role from user where userid<6")
    
    jsonstr = json.dumps(result)
    print(jsonstr)
  • 将JSON字符串反序列化为python对象

    source = '[{"username":"user1","password":"12345","phone":"13344445555"}]'
    jsonobj = json.loads(source)
    print(jsonobj[1]['username'])
  • json库中还有json.load和json.dump,用于操作文件

    with open('./1.txt',mode='w') as f:
      json.dump(result,f)            # 将result存到文件

三、装饰器

  • 在函数或方法或类前面,使用@符号进行声明的特殊操作,可以改变程序的执行顺序

    # 统计某段代码的执行时间
    import time
    def test()
      start =  time.time()      # 获取当前时间
      result = 99999
      for i in range(100)
          result = result + i -result * 15
      pritn(result)
      end = time.time()
      print(end - start)        # 共用时
    
    # 定义装饰器,用于统计函数的运行时间
    # 函数里面继续定义了一个函数,称之为内部函数(闭包)
    # 装饰器自带一个参数,func,用于获取被装饰函数的地址
    # 内部函数运行结束后,必须要返回其函数名(地址)
    def start(func):
      def inner():
          start = time.time()
          func()                 # 被调用的装饰函数
          end = time.time()
          print(end - start)
    return inner
    
    @start
    def test2():
      result = 99999
      for i in range(100)
          result = result + i -result * 15
      print(result)
    
    test2()
上一篇
下一篇