使用'尝试''提升','除了'编写短程序的功能

时间:2017-08-15 23:47:08

标签: python typeerror except valueerror raiserror

考虑用于表示圆形对象的Circle类。 Circle类的实例将具有名为radius的属性,该属性指示圆的大小。此类的构造函数方法(例如 init )将照常初始化此属性。

显然,Circle对象的大小小于或等于0是没有意义的。

如果有人尝试创建具有负半径或零半径的Circle对象,则应引发ValueError类型的异常。应使用以下字符串创建ValueError对象:

半径不得小于或等于0

此外,如果有人尝试创建具有非整数值半径的Circle对象,则应引发TypeError类型的异常。应使用以下字符串创建ValueError对象:

半径必须是整数值

使用构造函数方法定义Circle类,该方法可防止使用无效半径创建Circle对象。此类的 repr str 函数应返回以下字符串:

圈(x)的

其中x是圆的半径。

例如:

def main():
    try:
      c = Circle(10)
    except ValueError as x:
      print("Error: " + str(x))
    else:
      print(c)
def __init__(self, x):
    try:
      if x <= 0:
        raise ValueError('Radius must not be less than or equal to 0')
      elif x != int or x != float:
        raise TypeError('Radius must be an integer value')
    except ValueError as x:
        print('Error: {0}'.format(x))
    except TypeError as x:
        print('Error: {0}'.format(x))
main()

结果应为:

Circle(10)

如果c = Circle(-100),结果应为:

Error: Radius must not be less than or equal to 0

然而,&#34; def init的部分(self,x)&#34;是不正确的。 有人可以帮忙吗?! 谢谢!

1 个答案:

答案 0 :(得分:2)

您的代码有很多错误:

首先,你说你想要一个&#34; Circle课程&#34;,但你实际上并没有定义一个。 您必须创建一个班级Circle并将__init__移到其中。

其次,这一行不正确:

elif x != int or x != float:

我认为你的意图是确保x是浮点数或整数,如果不是,则引发错误。但是,编写它的方式,两个条件之一将始终为True:x为整数,因此x != float为True,x为浮点数x != int是真的,或x既不是真的也是如此。

像这样修改elif语句:

elif not isinstance(x, (int, float)):

第三,您可能需要切换if和elif的顺序,否则将任何非数值传递给构造函数将导致<=抛出异常。

最后,您可以将这两个except转换为一个:

except (ValueError, TypeError) as x:

所以最终结果将是:

class Circle:
    def __init__(self, x):
        try:
            if not isinstance(x, (int, float)):
                raise TypeError('Radius must be an integer value')
            elif x <= 0:
                raise ValueError('Radius must not be less than or equal to 0')
        except (ValueError, TypeError) as x:
            print('Error: {0}'.format(x))