Попробуйте и за исключением на RuntimeError в Python не перехватить ошибку - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть функция рекурсии, которая выдает эту ошибку «RuntimeError: максимальная глубина рекурсии, превышенная в cmp», когда я использую число, превышающее предел.Я пытаюсь вернуть блок исключения -1 (что является требованием), и элемент управления не передается в блок исключения.Пожалуйста, дайте мне знать, что неправильно в моей программе.Заранее спасибо

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

1 Ответ

0 голосов
/ 10 сентября 2018

Единственное, что есть внутри вашего 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, прежде чем передать его обратно вверх. Надеюсь, вы знаете, какой из тех, кого вы хотите.

...