在Python中的RuntimeError未捕获错误时尝试并执行除外
我有一个递归函数,它给出了这个错误RuntimeError:当我使用超过限制的数字时,cmp中超过了最大递归深度。我希望使except块返回-1,这是必需的,并且控件没有被转移到except块。请务必让我知道我的程序出了什么问题。提前谢谢在Python中的RuntimeError未捕获错误时尝试并执行除外,python,error-handling,runtime-error,try-catch,try-except,Python,Error Handling,Runtime Error,Try Catch,Try Except,我有一个递归函数,它给出了这个错误RuntimeError:当我使用超过限制的数字时,cmp中超过了最大递归深度。我希望使except块返回-1,这是必需的,并且控件没有被转移到except块。请务必让我知道我的程序出了什么问题。提前谢谢 def g(n): try: def f(x): if x == 1: return 1 elif x == 0.5:
def g(n):
try:
def f(x):
if x == 1:
return 1
elif x == 0.5:
return math.sqrt(PI)
else:
final_value = (x-1)*f(x-1)
return final_value
except RuntimeError:
return -1
n = f(n/2.0)
return n
您尝试忽略indicationError的唯一内容是def语句,而实际代码中可能没有这个错误。定义函数不会引发运行时错误,因此没有什么可捕获的 调用该函数会引发运行时错误,因此需要尝试调用该函数。两个明显的地方是递归调用:
try:
final_value = (x-1)*f(x-1)
except RuntimeError:
return -1
return final_value
…或围绕外部呼叫:
try:
n = f(n/2.0)
except RuntimeError:
return -1
return n
我不知道你想要哪一个。在外部调用中处理它意味着所有1000个递归帧都被丢弃,您只需从顶层返回-1。在内部调用中处理它意味着您从最里面的帧返回-1,但是从那里到顶部的每个帧在将其传递回之前都将-1乘以其本地x-1。希望你知道你想要的是哪一个。我不确定这应该做什么。对于偶数整数,它只是n/2!。对于奇数整数,它是阶乘函数的一种部分扩展,当你期望gamman/2+1时,它是接近gamman/2的实数。对于其他的一切,除非一个舍入误差恰好使你在下降的过程中达到1或0.5,否则它是一个无限递归到负无穷大。