异常处理-参考答案
任务名称:异常处理
打卡要求:
完成以下练习(第一题可以口述或者发文,第二题上传代码链接地址):
1. 详细说一下异常常见的种类
2. 程序设计:(以下这些是一个题目)
自定义一个Integer类
— 该类有个input方法,调用该方法一定会得到一个合法的数字(非数字为不合法,越界为不合法)
---- 如果是非数字不合法,需要打印不合法消息,然后用户需要重新输入
— 如输入’abc’,不合法消息就为:invalid literal for int() with base 10: ‘abc’
---- 如果是越界不合法,需要打印不合法消息,然后用户需要重新输入
— 如输入’2147483648’,不合法消息就为:ErrorMsg:2147483648 - 越界
提示:
1)该方法需要捕获并处理两次异常(内置异常ValueError,自定义异常SlopOverError)
2)该方法运用到递归方式处理更简单,如果用不到递归也可以
— 该类有个verifySlopOver方法,可以判断传入的数字是否越界(非-2147483648 ~ 2147483647为越界) ---- 如果数字越界,会主动抛出自定义SlopOverError异常,并传入数字和异常消息 自定义异常SlopOverError类
— 该类需要重写__init__方法
---- 有number、massage两个参数,number是数字类型的数,massage是字符串类型的异常消息
— 该类需要重写__str__方法
---- 通过number、massage两个属性格式化异常信息
"""
自定义一个Integer类
-- 该类有个input方法,调用该方法一定会得到一个合法的数字(非数字为不合法,越界为不合法)
---- 如果是非数字不合法,需要打印不合法消息,然后用户需要重新输入
-- 如输入'abc',不合法消息就为:invalid literal for int() with base 10: 'abc'
---- 如果是越界不合法,需要打印不合法消息,然后用户需要重新输入
-- 如输入'2147483648',不合法消息就为:ErrorMsg:2147483648 - 越界
提示:
1)该方法需要捕获并处理两次异常(内置异常ValueError,自定义异常SlopOverError)
2)该方法运用到递归方式处理更简单,如果用不到递归也可以
-- 该类有个verifySlopOver方法,可以判断传入的数字是否越界(非-2147483648 ~ 2147483647为越界) ---- 如果数字越界,会主动抛出自定义SlopOverError异常,并传入数字和异常消息 自定义异常SlopOverError类
-- 该类需要重写__init__方法
---- 有number、massage两个参数,number是数字类型的数,massage是字符串类型的异常消息
-- 该类需要重写__str__方法
---- 通过number、massage两个属性格式化异常信息
"""
class SlopOverError(BaseException):
def __init__(self, number, message):
self.number = number
self.message = message
def __str__(self):
return '<%s:%s>' % (self.number, self.message)
def verify_slop_over(self):
if self.number > 2147483647 or self.number < -2147483648:
return True
class Integer:
@classmethod
def input_number(cls):
error_tag = 0
try:
input_num = input("please input a num:")
if not input_num.isdigit():
error_tag = 1
print('invalid literal for int() with base 10:%s' % input_num)
raise ValueError('invalid literal for int() with base 10:%s' % input_num)
if SlopOverError(int(input_num), '越界').verify_slop_over():
error_tag = 1
print('ErrorxMsg:%s - 越界' % input_num)
raise SlopOverError(input_num, '数字越界')
finally:
return int(input_num) if error_tag == 0 else cls.input_number()
if __name__ == '__main__':
digit = Integer().input_number()
print(digit)