#__author : 'liuyang' 
#date : 2019/4/3 0003 上午 8:44


# 6小时 120分
#15:  - 18   60分
#19:  - 22   40+20分
#简单
#6小时
#60分  +20+20 +20
#60分及格不算 附加题

#60
#简答题 12道
#读程序
#简单编程

#编程题

# 异常处理
#logging 模块

#内置方法
#obj是一个对象,如果我们希望打印对象是可以看的,而不是一个内存地址
    #__str__里必须return  必须是str类型的值

#__str__\__repr__
    #都是在打印对象或者字符串格式化拼接对象时候自动触发的
    #__repr__是备胎
#print(obj) ,format ,%s ,str(obj),f'{obj}'优先使用__str__
    #如果 没有__str__,那么以上所有调用__repr__
#__repr__的应用场景
    #%r ,repr(obj) 会自动调用__repr__方法,
    #不会找__str__  没有repr 打印地址

#__new__    构造方法
    #创建一块属于对象的空间
    #new 一定是在init之前执行的
    #单例模式
# \__del__  #析构方法
    #删除一个对象之前,
class A:
    def __del__(self):
        print('aaa')
obj = A()
del obj
# del obj.name
# del obj.age

#__call__
#obj()会自动触发__call__

#with 上下文 管理
    #__enter__
    #__exit__

# with 类名() as __enter__返回值:
    #写我们需要的内容了(所有的内容都一块成功和失败)

#写我们需要的内容  之前 执行了 enter返回值
#写我们需要的内容    之前 执行了 exit返回值


#上下文管理应用
    #文件操作
    #并发编程  锁
    #django 框架中使用数据库的事务
#__author : 'liuyang' 
#date : 2019/4/3 0003 上午 9:15
# 两种异常
    #一种是语法错误 :空格 缩进 语法规则
        # if a<> b   编译的时候就编译不过去
            #pass   #invalid syntax  尽量避免
    #一种是逻辑错误
          #应该在程序当中写代码处理
                #条件判断
                #异常处理
            # l = []
            # num = int(input())
            # l[num]
#迭代器 StopIteration
#pickele  EOFOerror


#先认识一下异常
#如何去查异常 \解决异常
'''
import pickle
def func():
    f = open('test','w')
    pickle.load(f)  #报错 ,load 一个文件读,f 文件是写 所以报错
func()
def main():
    func()
main()

'''
'''
Traceback (most recent call last):
  File "D:/Python/S20/day25/2.两种异常.py", line 24, in <module>
    func()
  File "D:/Python/S20/day25/2.两种异常.py", line 23, in func
    pickle.load(f)
io.UnsupportedOperation: not readable'''
#io.UnsupportedOperation: not readable
# 异常类型      #提示我们为什么会报错
#Traceback  从下往上看的


#常见的异常
#name           NameError不定义一个变量就直接使用了
# 1/0           #ZeroDivisionError 不能除以一个零
# l = []
# [][1]          #IndexError  超出了索引范围
# int('aaa')     #ValueError     强转数据类型
# d = {}
# d['key']       #KeyError     没有键
# d = {}
# d{'key'}       #SyntaxError  非规定的
# class A:pass
# A.cou          #AttributeError访问一个不存在的
# a = 1
# a()             #TypeError 一个不可被调用的模块被调用了
# import aaa      #ModuleNotFoundError 找不到你要调用的模块
#默认的 都在这

#异常会导致什么
a = 1
b = 2
# print(c)        #报错  程序就无法继续执行了
print(a+b)

# 什么是异常处理                点击了没有涉及到的东西 游戏闪退    更新之后修补了这块
                              #代码不好就 经常闪退  没有预料到的逻辑
#是我们  在运行程序的过程中,如果遇到错误,就去事先处理它
#让我的程序不要因为报错而结束
#提高用户体验
#提高代码的容错性

# d = {'key': 'value'}
# d['name']

try :
    d = {'key':'value'}
    d['name']       #一旦报错
    # print('qqqxing')    #  这里不执行
except KeyError:    #就被捕获
    print('qqqxing')   #这样
    pass
print('wahah')
View Code
#__author : 'liuyang' 
#date : 2019/4/3 0003 上午 9:59
# 要用到异常处理的标志
# 有一个文件  是不确定的
    # 从文件里读取
    # 从input 接收
    # 从一个网页上面取东西
    # 用户输入手机号码 发送验证码
    # 爬取各种网页, 不存在的网址
#
# l = ['apple','banana','umberlla']
# for num,goods in enumerate(l,1):
#     print(num,goods)
# try:        # 不能把所有的放在这里  逻辑没问题
#             # 效率有问题  每次都判断是否出错
#     choose = int(input('asdgasd/'))
#     print(l[choose-1])
#
# except ValueError:
#     print('请输入一个数字')

# 多分支
# l = ['a' , 'b' , 'c']
# for num,goos in enumerate(l,1):
#     print(num,goos)
# try:
#     choose = int(input('请输入选择'))
#     print(l[choose-1])
# except ValueError:
#     print('请输入数字')
# except IndexError:
#     print('您输入的序号不在列表内')

# l = ['a' , 'b' , 'c']
# for num,goos in enumerate(l,1):
#     print(num,goos)
# try:
#     choose = int(input('请输入选择'))
#     print(l[choose-1])
#     a
# except (ValueError,IndexError):#输入 异常  单例
#     print('请输入正确的序号')
#
# except NameError:  #放上面也可以 但是不规范 这是另一方面的异常
#     print('发生了一个NameError')
# 不得非得 代码写的少

#  这段bug 代码少
try:
    # a
    # [][1]
    # {}['key']
    # 1/0
    import aaa
except NameError:
    print("NameError")
except IndexError:
    print("IndexError")
except KeyError:
    print("KeyError")
except ZeroDivisionError:
    print('')
except ModuleNotFoundError:
    print('')

'''
# 万能异常  几乎能捕获所有的异常
try:
    a
    [][1]
    {}['key']
    1/0
    import aaa
except Exception:
    print('Exception')

# 查看异常信息
try:
    # a
    # [][1]
    # {}['key']
    # 1/0
    import aaa   # 没有异常 #IndentationError

except Exception as e:      # 异常的小祖宗
    print('Exception',e)

#尽量不要用万能异常 如果你用了 一定要写as 返回错误类型 方便差错
#可能找不到错误类型  不写 e 不知道哪个类型的错
#  这个 和上面差不多  但是没法返回 什么错误
try :
   aaa
except:
    pass


# except (ValueError,IndexError):停在这里 如有特殊
# except Exception  #放在最后必须  截留筛漏
#  若万能放前面则 都拦住了


# 单分支
try:
    可能发生异常的代码
except 错误类型1:
    处理异常
#多分支
except 错误类型2:
    处理异常
# except (错误类型1,错误类型2):
#     处理异常

#万能异常
except Exception as e:        
    处理异常,记录异常类型

#万能异常+多分支
try :
    可能繁盛异常的的代码
except 错误另行1
    处理异常
except 错误类型2:
    处理异常
except Exception as e:
    处理异常,记录异常类型
'''
View Code
#__author : 'liuyang'
#date : 2019/4/3 0003 上午 10:36
'''
l = ['a','b','c']
for n , g  in  enumerate(l,1):
    print(n,g)
    # print('执行了')


try :
    cho = int(input('asdga'))
    print(l[cho-1])
    # str(cho)

except (ValueError,IndexError)as e:#发邮件 80个人
    print(e)
    print('输入正常的序号')    #发错了的失败的 走这里

# else:           #成功的  没有任何异常才会进来
#     print('执行了')
'''
# else:如果try 中的代码顺利的执行完,没有报错,执行else的代码
# 是用来汇报整个try中的代码执行成功用的
# 一般else  里的都是安全的,不会有报错隐患

# finally:
#     print('值')

def func(filename):
    try:
        f = open(filename,'r')
        con = f.read()
        return con
    except Exception as e:
        print(e)
    finally:    #无论如何都要执行
        f.close()
        print('yidinghuizhiixng ')
ret = func('test')
print(ret)


def wrapper(func):
    def inner(*args,**kwargs):
        print('before')
        ret = func()
        print('after')
        return  ret

        #等于上
        # try:
        #     print('b')
        #     return func()     #等待在这  不归还 ()后归还
        # finally:
        #     print('af')
    return inner

try :
    f = open('test')
    for line in f:
        a,b  = line.split(',')

# finally:    #出错了也执行
#     f.close()
#     print('执行我了')

# else : 如果try中的代码 没有错误就执行
#finally : 必须执行
    #遇到return 也先执行 finally 中的代码
    #遇到错误也在程序结束之前 执行finally 的代码

######try except      #单分支****
###### try except except      #多分支 ****
# try except ...else
# try except ...else finally
####### try except ...finally    ****
#try finally
View Code

 

#__author : 'liuyang' 
#date : 2019/4/3 0003 上午 11:04
# raise ValueError

# 抽象类
# 父类 子类  如果子类没有实现父类的方法就报错 早错早发现早治疗
# 提供给其他程序用的

# 自定义异常     # 继承 Exception 后面写项目
'''
class Taibai(Exception):    #__main__.Taibai: 异常
    def __init__(self,msg):
        self.msg = msg
        super().__init__()  #父类的
    def __str__(self):
        return self.msg
raise Taibai('具体的异常内容')
'''
# 断言
'''
if 1==2 :
    print(123)
else:
    print('报错')

#  不满足 不走了
assert 1 == 2
print(123)
'''
# 断言
# assert 条件
'''
import queue
q = queue.Queue()   # 空
q.get_nowait()
class Empty(Exception):
    def __init__(self,msg):
        self.msg = msg
        super().__init__()
    def __str__(self):
        return self.msg
class 班级:
    def __init__(self):
        self.students = ['赵大宝']
    def get(self):
        if not self.students:
            raise Empty('学生列表已为空')
        else:
            return self.students.pop()
clas = 班级()
stu1 = clas.get()
print(stu1)
stu2 = clas.get()
print(stu2)
'''
主动抛异常

 

#__author : 'liuyang' 
#date : 2019/4/3 0003 上午 11:43
#1.如何看异常   *****
#2.如何处理异常
    #try except
    #try except finally

#断言\自定义异常\主动抛异常  #几年后#写一个功能对公司的程序员
#assert 继承Exception   raise

# 1.异常处理不宜 加在大段代码外面
# try :
#     100 行代码
# except :
#     pass

# 2. 不要写太多个except
# try :
#     三行代码
# except:
#     pass

# 3 . 尽量少的 使用万能异常 ,并且一定不要在万能异常内部用pass
#  不知道哪出错

# 4. 在程序米有完成之前 , 不要在程序入口处 加异常处理

# 5. 给代码排错的时候, 一定要考虑 已经添加上的异常处理机制
总结
#__author : 'liuyang' 
#date : 2019/4/3 0003 上午 11:53
# 日志模块
# 为什么要写日志
    #一个卡务系统 :记录时间 地点  金额
    #谁在什么时候删掉的 删掉了某一个用户
    #某时某刻 登录了系统
    #检测代码是不是像我们想象的这样执行的

# 写文件  输出到屏幕
    #f.write , print

# 时间格式,  级别控制 ,更加便捷
# *** logging 模块不能自动 生成你需要的日志

# logging模块的使用
    #简单配置法          *** # 编码问题 (无法转码等)
    #logger 对象法     *****

import logging
logging.basicConfig(level = logging.DEBUG)#都显示

logging.debug('debug message')      #调试
logging.info('info message')        #普通
logging.warning('warning messaeg')  #警告
logging.error('error message')      #错误
logging.critical('critical message')   #严重错误
'''
WARNING:root:warning messaeg
ERROR:root:error message
CRITICAL:root:critical message'''

logging.basicConfig(level = logging.DEBUG)#都显示
#这里控制 显示什么层次的错误
# 文内里 设置错误
# 把print(mes)  换成 logging.debug(mes) #上面开关控制打不打印
logging.basicConfig(level = logging.WARNING)#上面的就显示
  # 替换打印的

#级别控制
# 时间模块
# logging.basicConfig(level = logging.DEBUG,
#                     format(),
#                     datefmt='',
#                     filename= ''
#                     )

# 默认情况下 , 不打印warning 一下级别的信息
# 1.中文显示乱码
# 2. 不能同时 输出到中文 和 。。

#logger 对象的方式来使用logging 模块
# 首先  先创建 logger 对象
# 第二  创建一个文件操作符
# 第三  传建一个屏幕操作符
# 第四  创建一个格式

#logger 绑定 文件操作符
#logger 绑定 屏幕操作符
# 文件操作符 绑定格式
# 屏幕操作符 绑定格式

import logging
logger = logging.getLogger()
fh = logging.FileHandler('log',encoding='utf-8')
sh = logging.StreamHandler()   #屏幕操作符
fmt = logging.Formatter(%(asc))
logging.addHandler(fh)
logger.addHandler(sh)
logger.warning('logger对象的warning')

# 选课系统
#登录
#功能
#给你的程序添加必要的日志信息
View Code

 

posted @ 2019-04-03 11:11  learnacode  阅读(175)  评论(0编辑  收藏  举报