5.10笔记+day14作业

这篇博客探讨了Python中的异常处理机制,包括如何捕获和处理多个异常,使用`try...except`、`else`和`finally`子句。此外,还介绍了三种常见的设计模式:单例模式、工厂模式和策略模式。作业部分要求实现特定的异常处理功能和设计模式应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#异常:是指在语法正确的前提下,程序运行时报错就是异常

try:
    print(1/0) #0不能做除数,这里是错的
except ZeroDivisionError as e:#注意的是这里的错误类型要与出现的错误对应,如果不对应是不能捕捉到异常的,依旧会报错
    print("出错",e)

#捕获多个异常
#1个try 多个except捕捉异常,只会执行捕捉到异常的语句,其他捕捉异常的语句不会执行
#注意的是若出现多个异常,只会执行第一个先出现的异常

try:
    print(1/0)
    b=[1,2]
    print(b[2])
except IndexError as f:
    print("出错2",f)
except ZeroDivisionError as e:
    print("出错1",e)

#捕获所有异常:两种方式都是只能捕获所有异常,但不能知道就是是那种
#格式1

try:
    print(3/0)
    b=[1,2,3]
    print(b[3])
except:     #except 后面不写异常类型,表示可以捕获所有的异常
    print("出错啦")

#格式2

try:
    print(3/0)
    b=[1,2,3]
    print(b[3])
except Exception:   #Exception 是所有异常的父异常 ,try中抛出的异常,Exception都能捕获
    print("出错")

#else格式 如果try中没有抛出异常则执行else中的代码,如果try中抛出了异常则不会执行else中的代码

try:
    print("hahha")
    print(1/0)
except:
    print("捕获到异常")
else:
    print("没有发生异常")   

#try…finally 格式:不管try中是否抛出异常最终都会执行finally中的代码

try:
    print("aaa")
    print(1/0)
    lst=[]
    print(lst[0])
except ZeroDivisionError as e:
    print(e)
except IndexError as e:
    print(e)
finally:
    print("无论有没有异常都会执行这句话")    

#异常触发
#1、抛出系统异常:

while True:
    name = input("请输入姓名(不少于三个字)")
    try:
        if len(name)<3:
            raise  Exception("字数太少,请重新输入。")
        else:
            pwd = input("请输入密码:")
        print(name,pwd)
    except Exception as e:
        print(e)    

#抛出自定义的异常:当程序中的异常不满足时,我们可以自定义类型异常

class ShortInputException(Exception):#继承Exception类
    def __init__(self,msg):
        self.msg=msg
    def __str__(self):
        return str(self.msg)
try:
    raise ShortInputException("异常")
except ShortInputException as e:
    print(e)    

#设计模式
#1、单例模式:改模式主要目的是确保某一个类只有一个实例存在

class Sun():
    __instance=None
    def __new__(cls, *args, **kwargs):
        if not cls.__instance:
            cls.__instance=object.__new__(cls)
            return cls.__instance
        else:
            return cls.__instance
    def __init__(self,name):
        self.name=name
a=Sun("你好")
b=Sun("我好")
print(a.name)
print(b.name)
#a和b 都是我好
print(a==b)#True
print(a is b)#True

#优化写法

class Sun():
    __instance=None
    def __new__(cls, *args, **kwargs):
        if not cls.__instance:
            cls.__instance=object.__new__(cls)
        return cls.__instance
    def __init__(self,name):
        self.name=name
a=Sun("你好")
b=Sun("我好")
print(a.name)
print(b.name)
print(a==b)
print(a is b) 

#2、工厂模式 是一个在软件开发中用来创建对象的设计模式

class BMW():
    def run(self):
        print("宝马跑")
    def stop(self):
        print("宝马停")
class  Benz():
    def run(self):
        print("奔驰跑")
    def stop(self):
        print("奔驰停")
class Audi():
    def run(self):
        print("奥迪跑")
    def stop(self):
        print("奥迪停")
class CarFatory():
    @classmethod
    def makeCar(cls,name):
        if name=="宝马":
            return BMW()
        elif name=="奔驰":
            return Benz()
        elif name=="奥迪":
            return Audi()
a=CarFatory.makeCar("宝马")
b=CarFatory.makeCar("奔驰")
c=CarFatory.makeCar("奥迪")
a.run()
b.run()
c.run()
a.stop()
b.stop()
c.stop()

#策略模式 为达到某个目的而采取的多种方法或手段

class CashNormal():
    def __init__(self):
        pass
    def getMoney(self,money):
        return money
class CashRate():
    def __init__(self,rate):
        self.rate=rate
    def getMoney(self,money):
        return self.rate*money
class CashReturn():
    def __init__(self,condition,ret):
        self.condition=condition
        self.ret=ret
    def getMoney(self,money):
        return money-money//self.condition*self.ret

class Celue():
    def __init__(self,obj):
        self.obj=obj
    def getMoney(self,money):
        return self.obj.getMoney(money)

if __name__=="__main__":
    zd={}
    money=float(input("请输入金额"))
    zd[0]=Celue(CashNormal())
    zd[1]=Celue(CashRate(0.8))
    zd[2]=Celue(CashReturn(300,50))
    ce=int(input("请输入消费策略"))
    if ce not in zd:
        ce=0
    fuqian=zd[ce].getMoney(money)
    print(fuqian)   

#观察者模式

class Boss():
    def __init__(self):
        self.status=""
        self.observers=[]
    def append(self,oberser):
        self.observers.append(oberser)
    def update(self):
        for obj in self.observers:
            obj.update()

class A():
    def __init__(self,name,boss):
        self.name=name
        self.boss=boss
class YeWuEmployee(A):
    def update(self):
        print("业务组{}别玩了,{}".format(self.name,self.boss.status))

class CaiWuEmployee(A):
    def update(self):
        print("财务组{},{}今天去饭店".format(self.name,self.boss.status))

if __name__=="__main__":
    x=Boss()
    x1=YeWuEmployee("张三",x)
    x2=CaiWuEmployee("李四",x)
    x.status="老板回国啦"
    x.append(x1)
    x.append(x2)
    x.update()   

作业

#1、定义一个函数func(filename) filename:文件的路径,函数功能:打开文件,并且返回文件内容,最后关闭,用异常来处理可能发生的错误。

def func():
    try:
        f=open("dd",encoding="utf-8")
    except Exception  as e:
        print(e)
    else:
        print(f.read())
        f.close()
func()

2、编写一个计算减法的方法,当第一个数小于第二个数时,抛出“被减数不能小于减数"的异常
def jisuan(a,b):
try:
if a<b:
raise Exception(“被减数不能小于减数”)
else:
print(a-b)
except Exception as e:
print(e)
a=jisuan(2,3)

#3、定义一个函数func(listinfo) listinfo:为列表,listinfo = [133, 88, 24, 33, 232, 44, 11, 44], 返回列表小于100,且为偶数的数

def func(listinfo):
        try:
            result = filter(lambda k: k < 100 and k % 2 == 0, listinfo)
        except Exception as a:
            return a
        else:
            b=[]
            for x in result:
                b.append(x)
        print(b)

func([133, 88, 24, 33, 232, 44, 11, 44])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值