2

嗨,我最近开始用 python 编码,我想知道如何处理错误。我做了教程diveintopython,在那里他使用raise error来反馈出了什么问题。这是我的情况:我有一个函数可以检查代表数字的字符串是否为 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 块会更好还是我应该返回一个 False

非常感谢

4

2 回答 2

8

最好提出一个异常,这就是异常的用途。

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

你的职能似乎确实受到人格分裂的影响。一方面,您将其命名为checkNumber,并且您的文档声称它正在检查该号码是否有效。另一方面,它正在转换、更改该数字、将其转换为字符串,甚至在全局长度为 7 的情况下将 a 添加0到它前面。pzn

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

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

于 2012-12-06T09:59:16.403 回答
3

纯粹主义者会说,在 Python 中“请求宽恕比请求许可更容易”,这意味着您应该始终尽可能使用异常。

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

现在对于像这样的方法convert_number(),您希望使用异常,否则返回代码的处理可能会使您的代码变得一团糟。

从您的代码中,我发现您return someNumber最后不应该这样做;你可以简单地返回TrueFalse

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

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

于 2012-12-06T10:19:09.117 回答