目录
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