检查自然数,通过assertRaise验证异常
Check natural number, validate exception through assertRaise
我创建了一个 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。我想确保此函数始终 returns True
或 False
并在必要时处理异常。就个人而言,我不认为这段代码是好的,原因如下:
我不确定将 return
语句放入 finally
块是否合适。该代码工作正常,因为它总是 returns True
或 False
。但是,我不确定这样使用 finally
是否造成了一些不良副作用。
我无法使用 unittest
中的 assertRaises
验证 TypeError
和 ValueError
。但是,assertRaises
在从 try
块中删除 TypeError
和 ValueError
并让这些异常未被处理后成功。如果通过 try
块内的 raise
引发异常,我如何使用 assertRaises
验证引发异常?
您的函数没有引发异常。
有两个异常可能会在函数内部引发,但由于它们中的每一个都被立即捕获,不会引发任何异常它,所以 assertRaises
没有什么可以抓住的。
下面是我编写函数的方式:
def is_natural_number(n):
return isinstance(n, int) and n > 0
如果调用 is_natural_number()
的代码不需要知道它 return 的原因 False
,那么 也不进行单元测试 ;他们只需要知道它是否有效。不要把事情复杂化!
旁白: 将您的 return
语句放在 finally
子句中在您的原始代码中是多余的。 finally
用于必须执行的代码,即使 try
子句中的异常未被捕获在 except
子句中,这在您的函数中不是这种情况(如果异常不是TypeError
或 ValueError
出现在 try
子句中,result
在任何情况下都未定义,因此当您尝试 return)。
我创建了一个 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。我想确保此函数始终 returns True
或 False
并在必要时处理异常。就个人而言,我不认为这段代码是好的,原因如下:
我不确定将
return
语句放入finally
块是否合适。该代码工作正常,因为它总是 returnsTrue
或False
。但是,我不确定这样使用finally
是否造成了一些不良副作用。我无法使用
unittest
中的assertRaises
验证TypeError
和ValueError
。但是,assertRaises
在从try
块中删除TypeError
和ValueError
并让这些异常未被处理后成功。如果通过try
块内的raise
引发异常,我如何使用assertRaises
验证引发异常?
您的函数没有引发异常。
有两个异常可能会在函数内部引发,但由于它们中的每一个都被立即捕获,不会引发任何异常它,所以 assertRaises
没有什么可以抓住的。
下面是我编写函数的方式:
def is_natural_number(n):
return isinstance(n, int) and n > 0
如果调用 is_natural_number()
的代码不需要知道它 return 的原因 False
,那么 也不进行单元测试 ;他们只需要知道它是否有效。不要把事情复杂化!
旁白: 将您的 return
语句放在 finally
子句中在您的原始代码中是多余的。 finally
用于必须执行的代码,即使 try
子句中的异常未被捕获在 except
子句中,这在您的函数中不是这种情况(如果异常不是TypeError
或 ValueError
出现在 try
子句中,result
在任何情况下都未定义,因此当您尝试 return)。