小学生绞尽脑汁也学不会的python(异常,约束,MD5加密,日志处理)

小学生绞尽脑汁也学不会的python(异常,约束,MD5加密,日志处理)

异常处理(处理)

  

1.产生异常.raise 异常类(),抛出异常
2. 处理异常:
            try:
                xxxxx # 尝试执行的代码.
            except 异常类 as 变量: # 出现错误的时候. 捕获到异常
                xxxxxx  # 处理异常ch

            try:
                """操作"""
            except Exception as e:
                """保护的父类,可以捕获所有异常"""
            else:
                """保护不抛出异常的代码,当try中无异常的时候执行"""
            finally:
                """最后总要执行我"""
def chu(a,b):
    return a/b
try:                       #尝试着运行
    ret = chu(10,0)
    print(ret)
except Exception as e:     #Exception 表示所有的错误
    print("除数不能是0")

try:
    print("各种操作...")
except ZeroDivisiongError as e:
    print("除数不能是0")
except FileNotFoundError as e:
    print("文件不存在")
except Exception as e:
    print("其他错误")

  

程序先执⾏操作, 然后如果出错了会走except中的代码. 如果不出错, 执⾏else中
# 的代码. 不论处不出错. 最后都要执⾏finally中的语句. ⼀般我们⽤try...except就够⽤了. 顶多
# 加上finally. finally⼀般⽤来作为收尾⼯作.
3. 自定义异常
继承Exception,那这个类就是一个异常类
lass GenderError(Exception):
    pass
class Person:
     def __init__(self,name,gender):
        self.name = name
        self.gender = gender

def nan_zao_tang_xi_zao(person):
    if person.gender != "男":
        raise GenderError("性别不对,这里是澡堂子")

p1 = Person("alex","男")
p2 = Person("eggon","蛋")

try:
    nan_zao_tang_xi_zao(p1)
    nan_zao_tang_xi_zao(p2)
except GenderError as e:
    print(e)
except Exceptiong as e:
    print("反正报错了")

  


4. 堆栈信息
import traceback
traceback.format_exc() 获取堆栈信息.处理异常:
mport traceback
"""继承Exceptiong.那个类就是一个异常类"""
class GenderError(Exception):
    pass
class Person:
    def __init__(self,name,gender):
        self.name = name
        self.gender = gender
def nan_zao_tang_xi_zao(person):
    if person.gender != "男":
        raise GenderError("性别不对,这里是男澡堂子")
p1 = Person("alex", "男")
p2 = Person("eggon", "蛋")

"""处理异常"""
try:
    nan_zao_tang_xi_zao(p1)
    nan_zao_tang_xi_zao(p2)
except GenderError as e:
    val = traceback.format_exc()  #获取到堆栈信息
    print(e)
    print(val)
except Exception as e:
    print("反正报错了")

  ************************************************************************************************************

 约束(难)
约束是对子类进行的约束。
一。 通过抛异常(简单)
在父类中给出一个方法。 这个方法中什么都不写。 就抛异常。 NotImplementError()
在子类中把上述的方法进行重写。
重写:子类重新定义父类中的方法。
lass Base:
    def login(self):
        raise Exception("你没有实现login方法()")
class Normal(Base):
    def login(self):
        pass
class Member(Base):
    def denglu(self):
        pass
class Admin(Base):
    def login(self):
        Pass

def login(obj):
    print("准备验证码...")
    obj.login()
    print("进入主页...")

n = Normal()
m = Member()
a = Admin()
login(n)
login(m)
login(a)

  

二。 抽象类和抽象方法(java, c
# )
接口: 类中都是抽象方法.
from abc import ABCMeta, abstractmethod

抽象方法: 抽象方法不用给出方法体.写个pass就行了
抽象类:
语法:类(metaclass=ABCMeta)
概念: 如果类中包含了抽象方法.这个类一定是抽象类
特点: 抽象类一般不创建对象.
抽象类中可以存在正常方法

可以约束子类必须实现抽象方法
from abc import ABCMeta,abstractmethod

class IGame(metaclass=ABCMeta):
    @abcstractmenthod
    def piay(self):
        pass
    def turn_off(self):
        print("破几把游戏,")
class DNFGame(IGname):
    def play(delf):
        print("dnf的玩法")

dg = DNFGame()
dg.play()

  *************************************************************************************************************************

         MD5加密
MD5加密:不可逆
引入模块
hashlib
1
创建md5对象
2.
把加密信息交给md5对象
3.
获取密文
mport hashl
obj = hashlib.md5()
obj.update("alex".encode("utf-8")) # 加密的必须是字节
miwen = obj.hexdigest()
print(miwen) # 534b44a19bf18d20b71ecc4eb77c572f

import hashlib

def my_md5(s):
    obj = hashlib.md5(b"fjlksajflkjasfsalwer123dfskjf")
    obj.update(s.encode("utf_8"))
    return minwen

username = input("请输入用户名:")
password = input("请输入密码:")

if username == "wusir" and my_md5(password) =="99fca4b872fa901aac30c3e952ca786d"
    print("成功")
else:
    print("失败")

  **********************************************************************************************************************************************************


日志处理(重要, 简单)
引入logging模块
简单配置即可(basicConfig 单一日志文件 fileHandler 文件助手可以实现多文件操作)
日志级别:
CRITICAL 最高的
ERRO 40
WARN 30
INFO 20
DEBUG 10

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)


# 多文件日志处理
# 创建⼀个操作⽇志的对象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系统')

  

猜你喜欢

转载自www.cnblogs.com/konghui/p/9724937.html