【问题标题】:Try and Except on RuntimeError in Python not catching the Error尝试并在 Python 中的 RuntimeError 上除外未捕获错误
【发布时间】:2018-09-10 03:13:26
【问题描述】:

我有一个递归函数,当我使用超出限制的数字时,它会给出此错误“RuntimeError:cmp 中超出最大递归深度”。我希望让 except 块返回 -1(这是要求)并且控制不会转移到 except 块。请让我知道我的程序出了什么问题。提前致谢

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

【问题讨论】:

  • 我不确定这应该做什么。对于偶数,它只是(n/2)!。对于奇数,它是阶乘函数向实数的某种部分扩展——接近gamma(n/2),而您期望gamma(n/2 + 1)。对于其他所有内容(除非发生舍入错误使您在下降的过程中碰到10.5),这是一个无限递归到负无穷大。

标签: python error-handling runtime-error try-catch try-except


【解决方案1】:

try 中唯一的内容(忽略 IndentationError,希望在您的真实代码中不存在)是 def 语句。定义函数不会引发RuntimeError,因此没有什么可捕获的。

调用函数会引发RuntimeError,因此您需要在调用函数周围加上try。两个明显的地方是递归调用:

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 个递归帧都被丢弃,而您只需从顶层 return -1 即可。在内部调用中处理它意味着您从最里面的帧返回-1,但是从那里到顶部的每一帧都将-1乘以其本地x-1,然后再将其传递回去。希望知道你想要哪一个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    • 2022-06-21
    • 2019-06-29
    • 1970-01-01
    相关资源
    最近更新 更多