拒绝负数作为 Python 中的异常

Mar*_* II 5 python exception negative-number

我正在尝试运行一个带有数字的基本提示,然后在其上运行一个递归函数。

任何负数都会导致递归错误,因为函数无法处理它们。

现在,我已经通过 Python 了解到这种情况需要“尝试/除外”模型。这是我想出的:

try: 
  choice = int(input('Enter a number: '))
  INSERT RECURSIVE FUNCTION HERE
except RecursionError as err:
  print('Error: ', str(err))
Run Code Online (Sandbox Code Playgroud)

这个异常不起作用,因为它仍然用红线显示整个递归过程,我的异常只替换了最后一行。我知道我可以通过逻辑轻松解决这个问题,例如:

if choice < 0:
  print("Error: Bro, We don't take no Negative Numbers around here.")
Run Code Online (Sandbox Code Playgroud)

然而,我被告知我们通常希望避免在 Python 中“通过逻辑解决错误”,而是通过“尝试/除外”模型工作。

我该怎么做才能通过“try/except”模型而不是“if/else”来拒绝负数?

如果你能帮助我理解一种对 ValueError 做出反应的方法,那将是另一个很大的帮助。

ala*_*lam 6

说,你只想打印正数,如果数字是负数,你会引发异常

a = int(raw_input())
if a < 0:
    myError = ValueError('a should be a positive')
    raise myError
print(a)
Run Code Online (Sandbox Code Playgroud)


Ant*_*ony 3

“更喜欢尝试/除外”只是一个指导方针,而不是一个硬性规定。在这种情况下,正如您所发现的那样,它没有任何意义。您应该if choice < 0:像平常一样使用。

一般来说,有三个选择的理由try/except,但都不适用于此。

  1. 如果您按顺序执行多个操作,则每个操作都可能失败,并且您并不关心哪一个操作失败。在这种情况下,您可以在整个代码序列周围使用 try 块,从而简化事情。
  2. 如果您希望调用者使用带有鸭子类型接口的用户定义类型,而该接口不实现任何特定的超类或抽象基类。这主要是编写库代码时需要考虑的问题。
  3. 如果您期望操作通常会成功,并且失败时会引发异常。在这种情况下,try/ except 通常会更快。

顺便说一句,为什么向新 Python 程序员强调“更喜欢 try/ except”的主要原因是,许多程序员来自异常缓慢或不存在的语言,这使得他们对使用异常产生偏见,即使在适当的情况下也是如此。