Python--异常处理
一、异常处理
1.ValueError 输入类型不能转换为int判断num1是否为数字,如果是,在执行后续操作,否则错误提示判断num2是否为数字,如果是,在执行后续操作,否则错误提 。
2.ZeroDivisionError 除数不能为0如果num2不为0的时候,在进行后续操作,否则错误提示。
3.解决方案:
1、传统方案
2、异常处理
try:
可能出现问题的代码/方法
except:
出现任何异常,该分支的代码会被执行
except 之后没有明确写出捕获异常类型的,意味可以捕获所有的异常
传统的解决方案:
1 #从键盘录入被除数与除数,求商,并打印结果 2 #a / b(传统的解决方案) 3 num1 = input("输入被除数") 4 num2 = input("输入除数") 5 # 转换成int 6 # 遇到错误: ValueError 输入类型不能转换为int 7 if num1.isdigit() and num2.isdigit(): 8 num1 = int(num1) 9 num2 = int(num2) 10 if num2 != 0: 11 # 求商 ZeroDivisionError 除数不能为0 12 result = num1 / num2 13 print("商为%g"%result) 14 else: 15 print("除数不能为0") 16 else: 17 print("数据有误)
异常处理:
1 #从键盘录入被除数与除数,求商,并打印结果 2 #a / b 3 num1 = input("输入被除数") 4 num2 = input("输入除数") 5 # 转换成int 6 try: 7 # 遇到错误: ValueError 输入类型不能转换为int 8 num1 = int(num1) 9 num2 = int(num2) 10 # 求商 ZeroDivisionError 除数不能为0 11 result = num1 / num2 12 print("商为%g"%result) 13 except ValueError: 14 print("输入类型有误") 15 except ZeroDivisionError: 16 print("除数不能为0") 17 # 处理ValueError,ZeroDivisionError两种类型的错误,如果有第三种,无法捕获 18 except (ValueError,ZeroDivisionError): 19 print("输入类型错误,除数不能为0")
4.捕获具体类型的错误
try:
可能出现问题的代码/方法
except 错误类型1:
出现对应类型的异常,该分支的代码会被执行
except 错误类型2:
except (错误类型3,错误类型4): <------>把错误类型用元组来装起来
......
5. 多个捕获异常分支的顺序问题
1.语法上没有顺序要求
2.逻辑上有顺序要求:
子类异常在前,父类异常在后
6. except 异常 as 变量:
将捕获到的异常/错误,存储到变量中
7.finally
最后执行的代码,即使遇到异常,没有捕获到的时候,该代码块也会执行
关闭文件,关闭数据库,关闭io流,关闭socket
8. try:
finally:
try可以跟finally结合使用
1 # 异常处理 2 # try---except 3 num1 = input("输入被除数") 4 num2 = input("输入除数") 5 try: 6 num1 = int(num1) 7 num2 = int(num2) 8 result = num1 / num2 9 print("%g"%result) 10 # 1. 11 except ValueError: 12 print("输出类型错误") 13 # 2. 14 except ZeroDivisionError: 15 print("除数不能为0") 16 # 3.把错误类型用元组来装 17 except(ValueError,ZeroDivisionError): 18 print("输入类型错误,除数不能为0") 19 # 将错误类型存储到变量里 20 except (ValueError) as result: 21 print(type(result)) 22 print(result) 23 # 没有捕获到异常时,该代码块会执行 24 else: 25 print("没有异常") 26 # 最后,最终,执行的代码 27 finally: 28 print("谢谢使用") 29 30 # ---------------------------------- 31 # try与finally 结合使用 32 try: 33 print("今天下雨") 34 finally: 35 print("没带雨伞")
二、自定义异常及抛出异常
自定义异常
GenderError
class GenderError(Exception):
继承于Exception或者BaseException
抛出异常
raise 异常对象
1 # 自定义异常类: 继承于Exception 或者 BaseException 2 class GenderError(Exception): 3 def __init__(self,errMsg): 4 self.errMsg = errMsg 5 6 class Student(): 7 def __init__(self,name,gender): 8 self.name = name 9 self.__gender = None 10 # self.__gender = gender 11 self.setGender(gender) 12 def setGender(self,gender): 13 if gender == '男' or gender == '女': 14 self.__gender = gender 15 else: 16 try: 17 raise GenderError("性别只能是男或者是女") 18 except GenderError as result: 19 print(result.errMsg) 20 def getGender(self): 21 return self.__gender 22 23 stu = Student('汤姆-爱迪生','未知') 24 stu.setGender('半男不女') 25 # 打印性别 26 print(stu.getGender())