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("程序继续知悉个")

 

posted on 2018-11-12 16:26  VastTry  阅读(152)  评论(0编辑  收藏  举报

导航