我创建了一个小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。我想确保此函数始终返回True
或False
并在必要时处理异常。就个人而言,我不相信这段代码是好的,原因如下:
我不确定将return
语句放入finally
块是否合适。代码工作正常,因为它始终返回True
或False
。但是,我不确定是否通过这样使用finally
引起了一些不良副作用。
我无法使用TypeError
中的ValueError
验证assertRaises
和unittest
。但是,从assertRaises
块中删除TypeError
和ValueError
后,try
成功了,并且无法处理这些例外情况。如果通过assertRaises
块内的raise
引发异常,如何使用try
来验证异常?
答案 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
子句中发生了ValueError
或try
,result
在任何情况下都不会被定义,因此当您尝试将其返回时,您会收到异常)。