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