【问题标题】:Use 'try', 'raise', 'except' function to write a short program使用 'try', 'raise', 'except' 函数编写一个小程序
【发布时间】:2018-01-23 23:31:19
【问题描述】:

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

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

如果有人试图创建一个半径为负数或零的 Circle 对象,那么您应该引发 ValueError 类型的异常。应使用以下字符串创建 ValueError 对象:

半径不能小于等于0

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

半径必须是整数值

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

圆(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

但是,“def init(self, x)”部分不正确。 有人可以帮忙吗?! 谢谢!

【问题讨论】:

  • 您似乎在任何地方都没有 Circle 类。

标签: python typeerror except valueerror raiserror


【解决方案1】:

你的代码有很多错误:

首先,您说您想要一个“Circle 类”,但实际上并没有定义一个。 您必须创建一个类 Circle 并将您的 __init__ 移动到其中。

第二,这一行不正确:

elif x != int or x != float:

我认为您的意图是确保 x 是浮点数或整数,如果不是则引发错误。但是,按照这种方式,两个条件之一将始终为 True:x 是整数,所以 x != float 是 True,x 是浮点数,所以 x != int 是 True,或者 x 是两者都不是,所以它们都是真实的。

像这样修改 elif 语句:

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

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

最后,您可以将这两个excepts 合二为一:

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))

【讨论】:

  • 您可以将elif not (isinstance(x, int) or isinstance(x, float)): 行缩短为简单的elif not isinstance(x, (int, float))isinstance 可以接受类型参数的元组来测试它的第一个参数。
  • @ChristianDean 感谢先生的小费。我已经编辑了我的答案。
猜你喜欢
  • 2016-10-31
  • 2017-03-09
  • 2013-12-19
  • 2011-06-26
  • 2011-05-08
  • 2016-03-10
  • 1970-01-01
  • 1970-01-01
  • 2010-10-22
相关资源
最近更新 更多