尝试并在Python中的RuntimeError上捕获错误

问题描述 投票:0回答:1

我有一个递归函数,当我使用超出限制的数字时,会出现此错误“运行错误: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
python error-handling runtime-error try-catch try-except
1个回答
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,然后再将其传回。希望你知道你想要哪一个。

© www.soinside.com 2019 - 2024. All rights reserved.