在Python中拒绝将负数作为异常
我试图运行一个基本的提示符,它接受一个数字,然后对它运行一个递归函数 任何负数都会导致递归错误,因为函数无法处理它们 现在,我通过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)) 这个异常不起
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")