异常处理_月隐学python第19课

 

目录

1. 异常处理

1.1 try-except语句

1.3 抛出异常

1.4 异常嵌套

1.5 assert断⾔

1.6 ⾃定义异常类

作业:

初级

中级


 


1. 异常处理

错误指的是代码有语法问题,⽆法解释运⾏,必须改正后才能运⾏如果代码没有语法问题,可以运⾏,但会出运⾏时的错误,例如除零错误,下标越界等问题,这种在运⾏期间检测到的错误被称为异常 ,出现了异常必须处理否则程序会终⽌执⾏,⽤户体验会很差。 Phthon⽀持程序员⾃⼰处理检测到的异常。可以使⽤try-except语句进⾏异常的检测和处理


1.1 try-except语句

执⾏流程:

  • 1、⾸先执⾏try中【代码块A】,如果出现异常,⽴即终⽌代码执⾏,转⽽到except块中进⾏异常处理
  • 2、异常处理except模块可以多个,从上往下匹配,如果能够匹配成功,⽴即执⾏相应的异常处理代码块,执⾏完毕后,不在往下匹配,转到3执⾏
  • 3、执⾏异常处理完毕后,如果有finally字句则执⾏finally字句,如果没有则执⾏【后续语句】
  • 4、如果匹配不到异常,有finally则执⾏finally,然后则抛出错误,终⽌程序执⾏。
  • 5、如果没有异常,如果有else字句则执⾏else字句,执⾏完else后,有finally字句则执⾏,没有则执⾏【后续语句】

注意事项:

  • except匹配顺序从上到下
  • except语句书写要求:精确的类型往前放,模糊的,不精确的往后放
  • except不带任何类型,则匹配所有类型异常,应该放到最后,吞掉异常
  • 可以将多种异常⽤元组的⽅式(异常类型1,异常类型2...异常类型n)书写,简化代码
  • except字句中e,是⼀个对象,打印它,会显示异常信息描述
  • try-except也可以捕获⽅法或函数中抛出的异常
  • 所有异常类型都继承⾃BaseException,使⽤BaseException可以将异常⼀⽹打尽
  • finally字句中可以进⾏⼀些清理⼯作,⽐如关闭⽂件,数据库等⼯作

1.3 抛出异常

⼿动抛出⼀个指定类型的异常,⽆论是哪种异常类都可以带⼀个字符串参数,对异常进⾏描述。
raise不带参数会把错误原样抛出

1.4 异常嵌套

在try块和excep块中还可以分别再嵌套try-except块


1.5 assert断⾔

语法: assert 条件 [,异常描述字符串]
执⾏流程:如果条件为假,则抛出AssertionError,条件为真,就当assert不存在
作⽤:对于可能出问题的代码,加上断⾔,⽅便问题排查

1.6 ⾃定义异常类

如果系统异常类型满⾜不了业务需求,那么可以⾃⼰定义异常类来处理。
⾃⼰定义的异常类必须继承BaseException或Exception
步骤:
在⾃定义异常类的构造函数中,调⽤⽗类构造函数
重写 __str__ ⽅法输出异常信息
编写异常处理⽅法处理异常

作业:

初级

1.利用封装和继承的特性完成如下操作:

class SmallStudent:
    def __init__(self, name, id, age, sex):
        self.name = name
        self.id = id
        self.age = age
        self.sex = sex

    def learn(self,course):
        print("{}学习的内容为:{}".format(self.name,course))
        return "{}学习的内容为:{}".format(self.name,course)

    def fight(self):
        print("打架")

xiaoming = SmallStudent("小明", 10010, 8, '男')
xiaoming.learn("语文 数学 英语")

class MiddleStudent(SmallStudent):
    def __init__(self, name, id, age, sex):
        super().__init__(name, id, age, sex)

    def fall_in_love(self):
        print("谈恋爱")

xiaoer = MiddleStudent("小二",20020,12,'男')
xiaoer.learn("语数外 生物化 史地政")

class BigStudent(MiddleStudent):
    def __init__(self, name, id, age, sex):
        super().__init__(name, id, age, sex)

    def skip_classes(self):
        print("{}逃课中。。。。。".format(self.name))

xiaosan = BigStudent("小三",30030,19,"女")
xiaosan.skip_classes()

2.主⼈杨夫⼈ 向客人 李⼩姐介绍⾃己家的宠物狗和宠物猫

中级

1.设计一个Person,包含姓名、年龄和性别三个私有成员属性,另外Person类还包含males和females两个私有类属性,用来记录男⽣和⼥生的数量, 可以通过number_male和number_female两个公有类方法获取males和females两个私有类属性的值。⾃己完成Person类的设计,然后实例化多个Person的对象, 分别统计男女的⼈数

2.编写⼀个简单的⼯资管理程序,系统可以管理以下四类人:

⼯⼈(worker)、销售员(salesman)、经理(manager)、销售经理(salemanger)。

所有的员⼯都具有员⼯号,姓名,⼯资等属性,有设置姓名,获取姓名,获取员工号,计算⼯资等⽅法。

1)⼯⼈:⼯⼈具有⼯作⼩时数和时薪的属性,⼯资计算法方法为⼯作小时数时薪。

2)销售员:具有销售额和提成比例的属性,⼯资计算⽅法为销售额提成⽐例。

3)经理:具有固定⽉薪的属性,⼯资计算⽅法为固定月薪。

4)销售经理:⼯资计算方法为销售额*提成比例+固定⽉薪。

请根据以上要求设计合理的类,完成以下功能:

1)添加所有类型的⼈员

2)计算⽉薪

3)显示所有⼈工资情况


class Worker:
    def __init__(self, id, name, work_hours, hour_value):
        self.id = id
        self.name = name
        self.work_hours = work_hours
        self.hour_value = hour_value

    def salary(self):
        return float(self.work_hours) * float(self.hour_value)


class Salesman:
    def __init__(self, id, name, sale, rate):
        self.id = id
        self.name = name
        self.sale = sale
        self.rate = rate

    def salary(self):
        return float(self.sale) * float(self.rate)


class Manager:
    def __init__(self, id, name, fixed):
        self.id = id
        self.name = name
        self.fixed = fixed

    def salary(self):
        return float(self.fixed)


class Salesmanager:
    def __init__(self, id, name, sale, rate, fixed):
        self.id = id
        self.name = name
        self.sale = sale
        self.rate = rate
        self.fixed = fixed

    def salary(self):
        return float(self.sale) * float(self.rate) + float(self.fixed)


aa = Salesmanager(1001, 'AA', 8000, 0.2, 1000)
print(aa.salary())


def AddWorkers():
    workers = []
    salesmans = []
    managers = []
    salesmanagers = []

    while 1:
        worker_post = input("请输入员工岗位(工人/销售员/经理/销售经理):")
        if worker_post == '工人':
            while 1:
                workers_data = input('(注意:输入ok则退出当前工种)请输入工人工号,姓名,工作时间,时薪:').split(" ")
                if workers_data[0] == 'ok' or workers_data[0] == 'OK':
                    break
                workers.append(Worker(workers_data[0], workers_data[1], workers_data[2], workers_data[3]))
        elif worker_post == '销售员':
            while 1:
                sales_data = input('(注意:输入ok则退出当前工种)请输入工人工号,姓名,销售额,提成比例:').split(" ")
                if sales_data[0] == 'ok' or sales_data[0] == 'OK':
                    break
                salesmans.append(Salesman(sales_data[0], sales_data[1], sales_data[2], sales_data[3]))
        elif worker_post == '经理':
            while 1:
                sales_data = input('(注意:输入ok则退出当前工种)请输入工人工号,姓名,固定工资:').split(" ")
                if sales_data[0] == 'ok' or sales_data[0] == 'OK':
                    break
                managers.append(Manager(sales_data[0], sales_data[1], sales_data[2]))
        elif worker_post == '销售经理':
            while 1:
                sales_data = input('(注意:输入ok则退出当前工种)请输入工人工号,姓名,销售额,提成比例,固定工资:').split(" ")
                if sales_data[0] == 'ok' or sales_data[0] == 'OK':
                    break
                salesmanagers.append(Salesmanager(sales_data[0], sales_data[1], sales_data[2], sales_data[3], sales_data[4]))
        else:
            print("输入错误,请重新输入")
        done = input("是否完成添加(Y/N):")
        if done == 'Y' or done == 'y':
            break
    staffs = [workers, salesmans, managers, salesmanagers]
    return staffs


def workers_out(workers):
    print("{:<2}\t {:<2}\t {:<2}".format('工号', '姓名', '工资'))
    for post in workers:
        for worker in post:
            print("{:<2}\t {:<2}\t {:<2}".format(worker.id, worker.name, worker.salary()))
        print()


def PayrollSystem():
    print("""
    **************欢迎使用小爷工资管理系统**************
    【1】添加员工
    【2】输出人员工资情况
    【0】退出系统
    *************************************************
    """)
    while 1:
        n = int(input("请输入您的选择:"))
        if n == 1:
            staffs = AddWorkers()
        if n == 2:
            workers_out(staffs)
        if n == 0:
            print('************欢迎再次使用本系统***********')
            break


PayrollSystem()

 运行测试结果

   **************欢迎使用小爷工资管理系统**************
    【1】添加员工
    【2】输出人员工资情况
    【0】退出系统
    *************************************************
    
请输入您的选择:1
请输入员工岗位(工人/销售员/经理/销售经理):工人
(注意:输入ok则退出当前工种)请输入工人工号,姓名,工作时间,时薪:1001 工一 320 30
(注意:输入ok则退出当前工种)请输入工人工号,姓名,工作时间,时薪:1002 工二 350 35
(注意:输入ok则退出当前工种)请输入工人工号,姓名,工作时间,时薪:ok
是否完成添加(Y/N):N
请输入员工岗位(工人/销售员/经理/销售经理):销售员
(注意:输入ok则退出当前工种)请输入工人工号,姓名,销售额,提成比例:2001 销售一 90000 0.1
(注意:输入ok则退出当前工种)请输入工人工号,姓名,销售额,提成比例:2002 销售二 80000 0.1
(注意:输入ok则退出当前工种)请输入工人工号,姓名,销售额,提成比例:ok
是否完成添加(Y/N):N
请输入员工岗位(工人/销售员/经理/销售经理):经理
(注意:输入ok则退出当前工种)请输入工人工号,姓名,固定工资:3001 经理一 6000
(注意:输入ok则退出当前工种)请输入工人工号,姓名,固定工资:3002 经理二 5000
(注意:输入ok则退出当前工种)请输入工人工号,姓名,固定工资:ok
是否完成添加(Y/N):N
请输入员工岗位(工人/销售员/经理/销售经理):销售经理
(注意:输入ok则退出当前工种)请输入工人工号,姓名,销售额,提成比例,固定工资:4001 小金一 80000 0.1 3000
(注意:输入ok则退出当前工种)请输入工人工号,姓名,销售额,提成比例,固定工资:4002 小金二 90000 0.1 4000
(注意:输入ok则退出当前工种)请输入工人工号,姓名,销售额,提成比例,固定工资:ok
是否完成添加(Y/N):Y
请输入您的选择:2
工号	 姓名	 工资
1001	 工一	 9600.0
1002	 工二	 12250.0

2001	 销售一	 9000.0
2002	 销售二	 8000.0

3001	 经理一	 6000.0
3002	 经理二	 5000.0

4001	 小金一	 11000.0
4002	 小金二	 13000.0


 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风中月隐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值