需求:
从键盘输入被除数与除数,求商 并打印结果
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晓码阁 版权所有