检查自然数,通过assertRaise

时间:2016-12-30 06:31:40

标签: python python-3.x exception-handling python-unittest

我创建了一个小python函数,它提供了一个简单的检查:参数n是一个自然数吗?你将如何完成这项检查呢?

这是我创建的代码:

def is_natural_number(n, print_err_msg=True):
    try:
        if not isinstance(n, int):
            raise TypeError("Your input is not of integer type.")
        if n < 1:
            raise ValueError("Your integer is less than 1.")
    except (TypeError, ValueError) as err:
        result = False
        if print_err_msg:
            print("Error: {}".format(err))
    else:
        result = True
    finally:
        return result

我正在使用Python 3.5。我想确保此函数始终返回TrueFalse并在必要时处理异常。就个人而言,我不相信这段代码是好的,原因如下:

  1. 我不确定将return语句放入finally块是否合适。代码工作正常,因为它始终返回TrueFalse。但是,我不确定是否通过这样使用finally引起了一些不良副作用。

  2. 我无法使用TypeError中的ValueError验证assertRaisesunittest。但是,从assertRaises块中删除TypeErrorValueError后,try成功了,并且无法处理这些例外情况。如果通过assertRaises块内的raise引发异常,如何使用try来验证异常?

1 个答案:

答案 0 :(得分:0)

您的功能不会引发异常。

有两个例外可以在内部函数中引发,但由于它们中的每一个都被立即捕获,所以没有任何内容被 引发,所以有&#39; s assertRaises无法抓住。

这是我如何写你的功能:

def is_natural_number(n):
    return isinstance(n, int) and n > 0

如果调用is_natural_number()的代码不需要知道它返回False的原因,那么既不进行单元测试;他们只需要知道它是否有效。不要过分复杂化!

旁白:return子句中放入finally语句在原始代码中是多余的。 finally用于必须执行的代码,即使try子句中的异常未在except子句中捕获,但在您的函数中不是这种情况(并且除了在TypeError子句中发生了ValueErrortryresult在任何情况下都不会被定义,因此当您尝试将其返回时,您会收到异常)。