day19-2018-11-12 约束,异常处理,日志
# # 贴吧 # # 项目经理(级别高一点儿) # class Base: # def login(self): # 强制子类做xxxx事 # raise NotImplementedError("子类没有实现该方法") # 报错. 抛异常 # # # 1. 普通账号 --> 翔哥 # class Normal(Base): # def login(self): # print("普通账号的登录") # # # 2. 吧务 - > 强哥 # class Member(Base): # def login(self): # print("吧务的登录") # # # 3. 百度员工 -> 明哥 # class Admin(Base): # def login(self): # 方法的覆盖和重写 # print("管理员的登录") # # # 项目经理 # def wodetian(obj): # obj.login() # # n = Normal() # wodetian(n) # # m = Member() # wodetian(m) # # a = Admin() # wodetian(a) # 在python中可以写出抽象类和抽象方法. 来约束子类 from abc import ABCMeta, abstractmethod # 贴吧 # 项目经理(级别高一点儿) # class Base(metaclass=ABCMeta): # 抽象类 # # 抽象方法 # @abstractmethod # staticmethod, classmethod # def login(self): # 强制子类做xxxx事 # pass # # def hehe(self): # 抽象类中可以有正常的方法 # print("我会呵呵呵") # # # b = Base() # 报错的. 原因是Base是一个抽象类. 含有抽象方法. 不允许创建对象的 # # # 一个类如果全部都是抽象方法. 这个类可以被称为接口. 用来约束子类和规范子类 # # # 1. 普通账号 --> 翔哥 # class Normal(Base): # pass # # def login(self): # 重写了父类中的抽象方法 # # print("普通账号的登录") # # n = Normal() ''' 当我们需要对子类进行约束: 1.抛出异常 NotImplementedError() 没有实现 -> 约定俗成. 多观察 2.写抽象类 from abc import ABCMeta, abstractmethod class Base(metaclass = ABCMeta): @abstractmethod def 方法(self): pass 如果一个类中包含了抽象方法. 那么这个类一定是一个抽象类 一个抽象类中可以包含正常的方法 接口: 接口中所有的方法都是抽象方法 子类必须重写父类中的抽象方法. 否则子类也是一个抽象类 ''' # from abc import ABCMeta, abstractmethod # # class Animal(metaclass=ABCMeta): # @abstractmethod # def chi(self): # 抽象的概念 # pass # # class Cat(Animal): # 子类 . # def chi(self): # 子类对抽象的内容给出具体的实现 . 重写 # print("猫用嘴吃") # # c = Cat() # c.chi() # # a = Animal() # 报错. 自己把报错的原因给出 # a.chi()
# 程序员是发现不了自己的错误的(边缘性错误) ''' try: xxxx except 错误名称 as 别名: 出现错误的时候. 要干什么... except 错误名称 as 别名: 出现错误的是偶. 要干什么 .... except Exception as e: # 所有错误的根 出现的所有的错误. 我都可以这样处理 else: # 很少用到 不出错的时候执行这里的代码 finally: 结束. 收尾工作 ''' # try: # print(1/0) # 0不能做除数 ZeroDivisionError: division by zero # except ZeroDivisionError as z: # print("错了. 除数不能为0") # 由python解释器来调用代码. 出现了错误. 系统会自动的产生一个叫异常的对象. # 系统会尝试着把错误返回给调用方. 过程被称为:抛异常 # 我们通过try...except 可以吧系统产生的这个错误获取到. 过程叫捕获异常 # import traceback # # 计算a+b # def cul(a, b): # if (type(a) == int or type(a) == float) and (type(b) == int or type(b) == float): # return a + b # else: # # 在这里有两种方案. 1. 直接返回 , 2. 抛出异常 # # raise 抛出 Exception 错误和异常,所有错误的根 # raise Exception("我要的不是这个. 你应该我传递int或者float") # # # try: # print(cul(1, "胡辣汤")) # 加上异常的处理 # except Exception as e: # # 获取到错误信息. 我们需要访问堆栈信息 # print(traceback.format_exc()) # 获取堆栈信息 # print("出现了错误") # 我们出现的错误. python中没有给出具体的记录, 慎用. 名字一定要符合规范 # JackException # 自定义异常 # class GenderException(Exception): # pass # # class Person: # def __init__(self, name, gender): # self.name = name # self.gender = gender # # # 洗澡 -> 男的进男浴室 # def goto_nan_yushi(self): # if self.gender != "男": # raise GenderException("性别不对") # 除了名字以外都是父类中的Exception # else: # print("欢迎光临.") # try: # p2 = Person("wusir", "女") # p2.goto_nan_yushi() # p1 = Person("alex", "男") # p1.goto_nan_yushi() # except GenderException as e: # print("你去男澡堂子干嘛?") # except Exception as e: # print("其他错误")
import logging # 创建⼀个操作⽇志的对象logger(依赖FileHandler) # open() file_handler = logging.FileHandler('zuo.log', 'a', encoding='utf-8') file_handler.setFormatter(logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s")) logger1 = logging.Logger('qq', level=20) logger1.addHandler(file_handler) # 把文件助手和日志对象绑定 logger1.error('我是A系统出错了') # 记录日志 # 再创建⼀个操作⽇志的对象logger(依赖FileHandler) file_handler2 = logging.FileHandler('you.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=20) logger2.addHandler(file_handler2) import traceback try: print(1/0) except Exception: logger2.critical(traceback.format_exc()) print("出错了. 请联系管理员") print("程序继续知悉个")