Сбой Python вместо вызова исключения - PullRequest
0 голосов
/ 21 ноября 2018

Я написал эту программу:

def fun():
 try: 1/0
 except: fun()
fun()

Я думал, что получу исключение, но вместо этого я получил следующую фатальную ошибку:

Fatal Python error: Cannot recover from stack overflow.

Current thread 0x00003bec (most recent call first):
File "<stdin>", line 2 in fun
File "<stdin>", line 3 in fun

(File "<stdin>", line 3 in funстрока показывается 98 раз), а затем программа завершает работу (вместо того, чтобы вызывать исключение).

Я не понимаю, почему это происходит.Когда я запускаю вышеупомянутую программу без ошибок, она просто вызывает исключение:

def fun():
 fun()
fun()

Создает следующее исключение:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in fun
  File "<stdin>", line 2, in fun
  File "<stdin>", line 2, in fun
  [Previous line repeated 995 more times]
RecursionError: maximum recursion depth exceeded

Но когда код ошибочен, программа просто падает.

Может кто-нибудь объяснить мне, почему это происходит?

1 Ответ

0 голосов
/ 21 ноября 2018

Да, вы вызываете свою функцию в рамках функции с тем же именем, ведущей вас по кроличьей норе рекурсии (функции, вызывающей себя) без выхода

def fun():
 try: 1/0
 except: fun()

Это означает, что когда вы вызываете fun()если 1/0 выдает ошибку, он перемещается в ветку except и вызывает функцию fun, которая, если 1/0 выдает ошибку, переходит в ветку except и вызывает функцию fun, которая, если 1/0 вызываетerror она переместится в ветку except и вызовет функцию fun, которая, если 1/0 выдаст ошибку, переместится в ветку except и вызовет функцию fun, которая ...

Если вы получитекартинка.

Так что, если вы изучаете ошибки, вы можете просто захотеть вернуть какое-то значение, например:

 def fun():
     try: 
         1/0
     except: 
         return "Error handling worked"

fun()
...