Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中拒绝将负数作为异常_Python_Exception_Negative Number - Fatal编程技术网

在Python中拒绝将负数作为异常

在Python中拒绝将负数作为异常,python,exception,negative-number,Python,Exception,Negative Number,我试图运行一个基本的提示符,它接受一个数字,然后对它运行一个递归函数 任何负数都会导致递归错误,因为函数无法处理它们 现在,我通过Python了解到,像这样的情况需要 “尝试/例外”模式。以下是我的想法: try: choice = int(input('Enter a number: ')) INSERT RECURSIVE FUNCTION HERE except RecursionError as err: print('Error: ', str(err)) 这个异常不起

我试图运行一个基本的提示符,它接受一个数字,然后对它运行一个递归函数

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

现在,我通过Python了解到,像这样的情况需要 “尝试/例外”模式。以下是我的想法:

try: 
  choice = int(input('Enter a number: '))
  INSERT RECURSIVE FUNCTION HERE
except RecursionError as err:
  print('Error: ', str(err))
这个异常不起作用,因为它仍然用红线显示整个递归过程,我的异常只替换最后一行。我知道我可以通过逻辑很容易地解决这个问题,例如:

if choice < 0:
  print("Error: Bro, We don't take no Negative Numbers around here.")
如果选择<0:
打印(“错误:兄弟,我们这里不接受负数。”)
然而,有人告诉我,我们通常希望在Python中避免“通过逻辑解决错误”,而不是通过“try/except”模型工作

我该怎么做才能通过“尝试/例外”模式而不是“如果/其他”模式拒绝负数

如果您能帮助我了解一种方法,使其对ValueError作出反应,那将是另一个很大的帮助。

首选尝试/例外”是一个指导原则,而不是一个硬性规定。在这种情况下,它没有任何意义,正如您所发现的。如果选项<0:与正常选项类似,则应使用

一般来说,有三个理由选择
try/except
,这里没有一个适用

  • 如果您按顺序执行多个操作,每个操作都可能失败,而您不在乎哪个操作失败。在本例中,您将在整个代码序列中使用try块,从而简化事情
  • 如果您希望调用方使用用户定义的类型和鸭子类型的接口,该接口不实现任何特定的超类或抽象基类。这主要是在编写库代码时需要考虑的问题
  • 如果您预期操作通常会成功,并且失败时会抛出异常。在这种情况下,try/except通常会更快
    作为旁注,新Python程序员之所以强调“宁愿尝试/例外”的主要原因是,许多程序员来自异常速度慢或不存在的语言,这使得他们甚至在适当的时候也不愿意使用异常,您只希望打印正数,如果该数字为负数,则会引发异常

    a = int(raw_input())
    if a < 0:
        myError = ValueError('a should be a positive')
        raise myError
    print(a)
    
    a=int(原始输入()
    如果a<0:
    myError=ValueError('a应为正')
    升起我的箭
    印刷品(a)
    
    if
  • 检查是否正常。不要让它变得比需要的更复杂。
    int
    input
    都不是递归的…@jornsharpe谢谢你指出这一点。我忘了包括我的递归函数在输入之后运行,在异常之前。我现在已经编辑好了。@MarkPuchalaII然后注意,您应该将第一行移出块-良好的错误处理的一部分是尽量少尝试
    try
    。因此,我应该运行“'choice='>'try'”,而不是“'try'>'choice='”。这对我来说肯定回答了很多问题。有没有一种方法可以通过一行运行简单的“assert”来报告任何错误,而不是整个回溯报告?@Mark如果参数为false,则
    assert
    语句将抛出AssertionError(并且运行python时没有-O或-O2参数)。如果要隐藏stacktrack,可以捕获异常,而不是让它传播到顶层。但我不知道你为什么要这么做。
    try: 
      choice = int(input('Enter a number: '))
      assert choice > 0 # Test if it true
    except AssertionError :
      print("Number is negative")