python中的异常模式和设计模式

异常的引入

  • 概念
    异常就是不正常,当python检测到一个错误时,解释器就无法继续执行下去了,反而出现了一些错误的提示,这就是所谓的异常。

捕获异常

  • try—except

案例:从键盘输入被除数与除数,求商并打印

  • 传统解决方法
  • 使用异常处理的解决方法
  • except 多个异常

-多个异常分开写(注意异常<父子>类的顺序)

try:
	<语句>        
except <异常类名字>:
	<语句>        
except <异常类名字>:
	<语句>        
else:
    #如果没有异常发生
	<语句>  
  • 多个异常写到一个元组中
try:
    代码
except(Exception1[,Exception2[,...ExceptionN]]]):
   	发生以上多个异常中的一个,执行这块代码
''''
  • 获取异常信息
try:
    f = open('124.txt', 'r')
    f.write('HelloWorld')
#将捕获到的异常存储到到变量errMsg中
except IOError as errMsg:
    print(errMsg)
  • 捕获所有异常

    • except 不带任何异常
try:
    a = 2/0
except:
    print("遇到异常")
  • except 父类Exception
try:
    b = 3/0
except BaseException as result:
    print(result)
  • 捕获异常中else的用法
try:
    b = 3/1
except BaseException as result:
    print(result)
else:
    # 可以访问b的值
    print("没有遇到异常,结果为:%d"%b)
  • try— finally finally顾名思义: 最终,最后的意思

    • 用处
      确保最后一定要执行的,比如:文件关闭、数据库关闭、socket关闭,等…
    • 案例:(文件关闭问题)
try:
    f = open('123.txt', 'r')
    # 如果遇到异常,后续代码不再执行,直接执行except模块
    f.write('HelloWorld')
    # 在这关闭文件是否合适
    f.close()
except IOError as errMsg:
    print(errMsg)
else:
    print("写入文件成功")
finally:
    # 最终一定要关闭文件(打印,验证是否执行)
    f.close()
    print("finally,文件关闭")

抛出自定义异常

  • 自定义异常

通过创建一个新的异常类,程序可以命名它们自己的异常。
异常应该是典型的继承自Exception类,通过直接或间接的方式
#自定义异常类,直接或者间接继承Exception
class GenderException(Exception):
def init(self):
super().init()
# args 为BaseException的属性
self.args = ‘性别只能为男或者女’
# 也可以自定义一个属性
self.msg = ‘性别只能为男或者女’

  • 手动抛出自定义异常
    • 语法: raise [Exception [, args [, traceback]]]
class Student(object):
    def __init__(self, name, gender, age):
        self.__name = name
        self.setGender(gender)
        self.__age = age
    def setGender(self, gender):
        if gender == '男' or gender == '女':
            self.__gender = gender
        else:
            # 抛出一个自定义的性别异常(也可以以列表的形式抛出多个异常)
            # raise [GenderException(), Exception()]
            raise GenderException()
try:
    stu1 = Student('大黄', '男1', 18)
except GenderException as e:
    # 打印自定义的信息
    print(e.msg)
    # 打印父类属性的信息
    print(e.args)

设计模式

  • 概念
    是一种常用的软件设计模式,应用该模式的类一个类只有一个实例,即一个类只有一个对象实例。
  • 作用:
    • 保证全局对象的唯一性
  • 用法
    因为创建对象时,会默认调用__new__,以及__init__方法,所以,需要重写这两个方法完成
    注意点: 对象唯一,只进行一次初始化
    #保证创建对象的唯一性,需要重写__new__方法
  • 使用场景(购物车)
class ShoppingCart():
    __hasCart = None
    __hasInit = False
    def __new__(cls, *args, **kwargs):
        if not cls.__hasCart:
            cls.__hasCart = object.__new__(cls)
        return cls.__hasCart
    def __init__(self):
        if not self.__hasInit:
            self.shopping_list = []
            ShoppingCart.__hasInit = True
s1 = ShoppingCart()
s1.shopping_list.append('苹果1个')
s2 = ShoppingCart()
s2.shopping_list.append('手机一个')
print(id(s1))
print(s1.shopping_list)
print(id(s2))
print(s2.shopping_list)

工厂模式

  • 工厂模式是一个在软件开发中用来创建对象的设计模式。 当程序运行输入一个“类型”的时候,需要创建于此相应的对象。这就用到了工 厂模式。在如此情形中,实现代码基于工厂模式,可以达到可扩展,可维护的代 码。当增加一个新的类型,不在需要修改已存在的类,只增加能够产生新类型的 子类
  • 案例:
class Car(object):
    def run(self):
        print('吧里吧里的跑...')
    def stop(self):
        print('蹭蹭的停车...')
class BMW(Car):
    def run(self):
        print('宝马-->>>吧里吧里的跑...')
    def stop(self):
        print('宝马-->>>蹭蹭的停车...')
class Benz(Car):
    def run(self):
        print('奔驰-->>>吧里吧里的跑...')
    def stop(self):
        print('奔驰-->>>蹭蹭的停车...')
class Skoda(Car):
    def run(self):
        print('斯柯达-->>>吧里吧里的跑...')
    def stop(self):
        print('斯柯达-->>>蹭蹭的停车...')
class CarFactory(object):
    def new_car(self, name):
        if name == 'BMW':
            return BMW()
        if name == 'Benz':
            return  Benz()
        if name == 'skd':
            return Skoda()
class CarStore(object):
    def __init__(self, factory):
        self.factory = factory
    def order(self, name):
        new_car = self.factory.new_car(name)
        return new_car
car_factory = CarFactory()
car_store = CarStore(car_factory)
car = car_store.order('skd')
car.run()
car.stop()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值