异常处理,约束,MD5加密,日志处理
#异常 # 程序运行过程中产生的错误, 不正常 def chufa(a, b): try: # 尝试执行xxx代码 ret = a/b # 如果这里出现了错误. 异常. 系统内部会产生一个异常对象. 系统会把这个错误抛出. 抛给调用方 return ret except ZeroDivisionError as e: # 内部产生的所有异常都会被捕获, 捕获的异常对象会交给e print(e) print("出错了. 0不能是除数") except FileNotFoundError as e: # 内部产生的所有异常都会被捕获, 捕获的异常对象会交给e print(e) print("出错了. 0不能是除数") except StopIteration as e: # 内部产生的所有异常都会被捕获, 捕获的异常对象会交给e print(e) print("出错了. 0不能是除数") except Exception as e: # 内部产生的所有异常都会被捕获, 捕获的异常对象会交给e print(e) print("出错了. 0不能是除数") ret = chufa(10, 0) print(ret) # 计算两个整数的加法 def add(a, b): if type(a)!=int or type(b) != int: # return raise TypeError("我这里只要int, 不要别的类型") return a + b add(123, "abc") import traceback class GenderError(Exception): pass class Person: def __init__(self, name, gender): self.name = name self.gender = gender def nan_gu_ke_xi_zao(per): if per.gender != "男": raise GenderError("这里是刘伟的男澡堂子. ") else: pass p1 = Person("alex", "不详") # nan_gu_ke_xi_zao(p1) p2 = Person("wusir", "不详") try: nan_gu_ke_xi_zao(p2) except GenderError as g: print(g) val = traceback.format_exc() # 获取错误堆栈 print(val)
#约束 #1.抛异常约束 class Base: def login(self): raise NotImplementedError("没有实现login方法") # 专业的写法 def kantie(self): raise NotImplementedError("没有实现看帖功能") # 张三 class Normal(Base): def login(self): print("普通人登陆") # 李四 class Member(Base): def denglu(self): print("吧务登陆") # 王五 class Admin(Base): def login(self): print("管理员登陆") def login(obj): print("产生验证码") obj.login() # 标准在这里. 必须由login print("进入主页") # 场景 n = Normal() m = Member() a = Admin() login(n) login(m) login(a) # 重写:子类对父类提供的方法不满意。 重新去定义这个方法 #2.抽象类和抽象方法约束 from abc import ABCMeta, abstractmethod class Animal(metaclass=ABCMeta): # 在父类中写出metaclass= xxx 抽象类, 类中存在抽象方法, 类一定是抽象类 @abstractmethod # 抽象方法 def chi(self): # 抽象的概念. pass def haha(self): print("娃哈哈") class Cat(Animal): # 子类必须实现父类中的抽象方法. def chi(self): # 具体的实现 print("猫爱吃鱼") Cat() from abc import ABCMeta,abstractmethod class Base(metaclass=ABCMeta): @abstractmethod def login(self):pass # 张三 class Normal(Base): def login(self): print("普通人登陆") # 李四 class Member(Base): def login(self): print("吧务登陆") # 王五 class Admin(Base): def login(self): print("管理员登陆") def login(obj): print("产生验证码") obj.login() # 标准在这里. 必须由login print("进入主页") # 场景 n = Normal() m = Member() a = Admin() login(n) login(m) login(a)
#md5加密 import hashlib # 1. 创建一个MD5对象 obj = hashlib.md5(b"flkjsdalkfjklasdjfklasjkflasdjklfasdjflkadsj") # 加盐 # 2. 把要加密的内容给md5 obj.update("alex".encode("utf-8")) # 必须是字节 # 3. 获取密文 val = obj.hexdigest() # 534b44a19bf18d20b71ecc4eb77c572f aa7aa5ec13222b27f76a094207c5ac75 print(val) def my_md5(val): obj = hashlib.md5(b"flkjsdalkfjklasdjfklasjkflasdjklfasdjflkadsj") obj.update(val.encode("utf-8")) val = obj.hexdigest() return val # 注册的时候. 用md5进行加密. 存储的是加密后的密文 username = input("请输入用户名") password = input("请输入密码") # cun = my_md5(password) # print(cun) # alex 26adff81aa6778d26999b95ddc0e50b2 if username == "alex" and my_md5(password) == "26adff81aa6778d26999b95ddc0e50b2": print("登录成功") else: print("登录失败")
#日志处理 #1.单文件日志设置 import logging logging.basicConfig(filename='app.log', format='%(asctime)s - %(name)s - %(levelname)s - %(module)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S', level=40) # level 设置级别. 当你的信息的级别>=level的时候才会写入日志文件, 默认30 # CRITICAL = 50 # FATAL = CRITICAL # ERROR = 40 # WARNING = 30 # WARN = WARNING # INFO = 20 # DEBUG = 10 # NOTSET = 0 # 写日志 # logging.critical("我是critical") # logging.error("我是error") # logging.warning("我是警告") # logging.info("我是基本信息") # logging.debug("我是调试") # logging.log(2, "我是自定义") import traceback for i in range(20): try: if i % 3 == 0: raise FileNotFoundError("我是FileNotFountException") elif i % 3 == 1: raise StopIteration() elif i % 3 == 2: raise KeyError() except FileNotFoundError as e: val = traceback.format_exc() logging.error(val) except StopIteration as e: val = traceback.format_exc() logging.error(val) except KeyError as e: val = traceback.format_exc() logging.error(val) except Exception as e: val = traceback.format_exc() logging.error(val) # 2.多文件日志处理 # 创建⼀个操作⽇志的对象logger(依赖FileHandler) file_handler = logging.FileHandler('l1.log', 'a', encoding='utf-8') # 设置日志文件内容的格式 file_handler.setFormatter(logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s")) logger1 = logging.Logger('A', level=40) logger1.addHandler(file_handler) # 记录日志 logger1.error('我是A系统') # 再创建⼀个操作⽇志的对象logger(依赖FileHandler) file_handler2 = logging.FileHandler('l2.log', 'a', encoding='utf-8') file_handler2.setFormatter(logging.Formatter(fmt="%(asctime)s - %(name)s -%(levelname)s -%(module)s: %(message)s")) logger2 = logging.Logger('B', level=40) logger2.addHandler(file_handler2) # 记录日志 logger2.error('我是B系统')