引发错误与返回False python3

时间:2012-12-06 09:52:56

标签: python return raise try-except

您好我最近在python中开始编码,我想知道如何处理错误。 我做了教程diveintopython,在那里他使用加注错误来提供错误的反馈。 在这里我的情况: 我有一个函数,它检查表示数字的字符串是7或8位长还是其他一些东西

def checkNumber( someNumber ):
  ''' checks if Number is valid '''
  someNumber = str(someNumber);
  if not 6 < len(someNumber) < 9:
     raise ValueError('number must be either 7 or 8')
  if not re.search('^[0-9]{7,8}$', someNumber):
     raise ValueError('only digits from 0...9')
  sum = 0
  if len(pzn) == 7: someNumber = '0' + someNumber
  for n, a in list(enumerate(someNumber[:-1], start=1)):
     sum += int(a)*n
  if someNumber[-1]==str(sum%11):
     return someNumber
  else:   
     raise ValueError('not a vaild code')

我独立使用此功能,但我也会从另一个函数调用它,它扫描条形码并调用此函数来验证代码。因此,如果扫描号码是正确的,它应该继续,如果不是,它应该继续扫描。 像我这样做更好,并在扫描仪功能中放置一个try / except块,或者我应该返回一个错误的

非常感谢

2 个答案:

答案 0 :(得分:7)

提出异常更好,这就是例外情况。

此外,返回False会要求您的代码处理0False之间的差异测试。突然你需要测试函数的返回值。

你的功能似乎确实受到了人格分裂的影响。一方面,您将其命名为checkNumber,您的文档声称它正在检查该号码是否有效。另一方面,它是转换,更改该数字,将其转换为字符串,如果0全局的长度为7,则甚至在pzn前加上{{1}}。

如果您的所有函数都在测试数字是否有效,那么返回布尔值是有意义的。然后,使用异常可以为您提供有关验证失败性质的更多信息,但如果您不需要该信息,则布尔值就足够了。

但是如果你还需要将你的数字转换为不同的类型和格式,你需要重命名你的函数,然后验证错误实际上是正常行为的一个例外。然后期望函数返回转换后的值,无效输入应该引发异常,表明由于输入中的某些错误,它无法返回正常值。

答案 1 :(得分:2)

纯粹主义者会说在Python 中“请求宽恕比允许更容易”,这意味着,你应该尽可能地使用例外。

我也更喜欢使用例外,有意义。对于直观地应该返回TrueFalse的方法(例如is_valid_number()之类的东西),我只是发现更明显/可读,只返回布尔值而不引发任何异常。 / p>

现在对于像convert_number()这样的方法,你想要使用异常,否则返回代码的处理可能会使你的代码陷入混乱。

从您的代码中,我发现您最后不应该return someNumber;您只需返回TrueFalse

如果您对检查失败的原因感兴趣,那么使用异常是可行的方法,因为您可以干净地向调用者返回“错误消息”。在这种情况下,您也不需要返回任何内容,您调用它并且不会引发任何异常的事实已经意味着该数字有效。

最后,如果您打算将数字转换为其他内容,那么您的方法应该被调用convert_number(),如果一切正常则返回数字,并在出现错误时引发异常。