需求:
从键盘输入被除数与除数,求商 并打印结果
1.输入的数据类型问题 ValueError:
2.ZeroDivisionError: division by zero
try-except
代码如下
a = int(input("请输入被除数")) b = int(input("请输入除数")) print("商为:%d" % a/b)
为了程序正常执行结束,改动如下
a = input("请输入被除数") b = input("请输入除数") #判断 a必须是全为数字组成才可以转换成int if a.isdigit() and b.isdigit(): a = int(a) b = int(b) #保证b不能为0才可以求商 if b != 0: c = a / b print("商为:%d" % c) else: print("ZeroDivisionError: division by zero") print("除数不能为0") else: print("输入类型有误")
注意:上面的代码臃肿了很多,下面我们利用异常的知识点对代码进行改进
a = input("请输入被除数") b = input("请输入除数") try: a = int(a) b = int(b) c = a / b print("商为:%d" % c) except: print("输入类型有误或者除数为0")
异常处理:
try:
可能出现问题的代码
except:
捕获到异常后执行的代码
try:
可能出现问题的代码
except Exception as e:
print(e.args)
try:
可能出现问题的代码
except 异常1:
捕获到异常1后执行的代码
except 异常2:
捕获到异常2后执行的代码
except 异常3:
捕获到异常3后执行的代码
多个异常之间,子类在前,父类在后
try:
可能出现问题的代码
except(异常1,异常2...)
捕获到异常元组中任何一个异常执行的代码
注意:元组中的异常,没有顺序要求
a = input("请输入被除数")
b = input("请输入除数")
# 可以存在多个except分支,多个异常之间,要求,子类在前,父类在后
# try:
# a = int(a)
# b = int(b)
# c = a / b
# print("商为:%d" % c)
# except ValueError as e:
# print(type(e))
# print(e)
# except ZeroDivisionError:
# print("数学异常")
# except Exception:
# print("遇到异常")
# try:
# print("转换a")
# a = int(a)
# print("转换b")
# b = int(b)
# print("计算")
# c = a / b
# print("商为:%d" % c)
# except ValueError as e:
# print("输入类型有误")
# except ZeroDivisionError:
# print("除数为0")
try:
print("转换a")
a = int(a)
print("转换b")
b = int(b)
print("计算")
c = a / b
print("商为:%d" % c)
# 这种异常写法,与顺序无关,写起来方便,但是不推荐使用,原因在于不能针对每一种异常有针对性的应对措施
except (Exception,ValueError,ZeroDivisionError) as e:
print(type(e))
print("输入类型有误/或者除数为0")
#args为BaseException中的一个成员变量,存储错误原因
print(e.args)
异常:try except else finally
else:
没有异常的时候执行
finally:
不管是否有异常,都会在程序结束前执行
异常中的else语法几乎不用
# class Data():
# __single = None
# __firstInit = False
# def __new__(cls, *args, **kwargs):
# # if cls.__single == None
# if not cls.__single:
# cls.__single = super().__new__(cls)
# # return cls.__single
# return cls.__single
# def __init__(self,name):
# if not Data.__firstInit:
# self.name = name
# Data.__firstInit = True
# data1 = Data('123')
# data2 = Data('456')
# print(id(data1))
# print(id(data2))
# print(data1.name)
# print(data2.name)
# try:
# file = open('123.txt', 'r', encoding='utf-8')
# content = file.read()
# print(content)
# file.close()
# except:
# print("io异常")
# else:
# print("没有异常")
# for i in range(5):
# print(i)
# else:
# print("循环结束")
try:
file = open('123.txt', 'w', encoding='utf-8')
file.write('HelloWorld1\n')
file.write('HelloWorld2\n')
file.write('HelloWorld3\n')
# 抛出的是TypeError,却用ValueError去处理,结果就是处理不了
# file.write([1,2,3,4])
file.write([1,2,3,4].__str__())
except ValueError as e:
print(e.args)
else:
print("没有异常")
finally:
file.close()
#数据库关闭,socket关闭,io流关闭
print("谢谢使用")
try:
print("试一试")
finally:
print("最后执行的代码")
对比于Java,在Python中没有Error这一概念;
在Python中,编译时的错误Error,也被Python解析器认为是异常Exception;
异常的传递过程跟Java是一模一样的;
def test1(): print("-" * 10 + "test1开始" + "-" * 10) try: print(aa) except: pass print("-" * 10 + "test1结束" + "-" * 10) def test2(): print("-" * 10 + "test2开始" + "-" * 10) test1() # try: # test1() # except: # pass print("-" * 10 + "test2结束" + "-" * 10) def test3(): print("-" * 10 + "test3开始" + "-" * 10) test2() # try: # test2() # except: # pass print("-" * 10 + "test3结束" + "-" * 10) # try: # test3() # except: # pass test3()
自定义异常:
自己创建异常类,继承Exception
抛出异常 raise 异常对象
PI = 3.14 class GenderError(Exception): class_id = 210 def __init__(self): self.errMsg = '性别异常,只能设置为男或者女' class Student(): def __init__(self,name,gender): self.name = name # self.__gender = gender self.setGender(gender) def setGender(self,gender): if gender == '男' or gender == '女': self.__gender = gender else: #抛出异常 raise GenderError() def getGender(self): return self.__gender def showInfo(stu): print(stu) stu1 = Student('刘忙','男') try: stu1.setGender('未知') except Exception as e: print(type(e)) print(e.args) print(e.errMsg)
over......
备案号:湘ICP备19000029号
Copyright © 2018-2019 javaxl晓码阁 版权所有