Python课程设计 第 29 / 52 篇

异常处理-参考答案

任务名称:异常处理

打卡要求:

完成以下练习(第一题可以口述或者发文,第二题上传代码链接地址):

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)