Вы не можете «поднять» и «вернуть» одновременно, поэтому вам нужно добавить специальную переменную к возвращаемому значению (например, в кортеже) в случае ошибки.
Например: у меня есть функция (с именем «func»), которая что-то считает, и мне нужен (частичный) результат, даже если во время подсчета произошло исключение. В моем примере я буду использовать исключение KeyboardInterrupt (пользователь нажал CTRL-C).
Без обработки исключений в функции (это неправильно, при любом исключении функция ничего не возвращает):
def func():
s=0
for i in range(10):
s=s+1
time.sleep(0.1)
return s
x=0
try:
for i in range(10):
s=func()
x=x+s
except KeyboardInterrupt:
print(x)
else:
print(x)
А теперь я ввожу логическое возвращаемое значение (в кортеже рядом с исходным возвращаемым значением), чтобы указать, произошло ли исключение. Поскольку в функции я обрабатываю только исключение KeyboardInterrupt, я могу быть уверен, что это произошло, поэтому я могу вызвать то же самое, где я вызывал функцию:
def func():
try:
s=0
for i in range(10):
s=s+1
time.sleep(0.1)
except KeyboardInterrupt: # <- the trick is here
return s, True # <- the trick is here
return s, False # <- the trick is here
x=0
try:
for i in range(10):
s,e=func()
x=x+s
if e: # <- and here
raise KeyboardInterrupt # <- and here
except KeyboardInterrupt:
print(x)
else:
print(x)
Примечание: мой пример — python3. Модуль времени используется (в обоих приведенных выше кодах), но я не импортировал его, чтобы сделать его короче. Если вы хотите действительно попробовать, поставьте в начале:
import time
person
redseven
schedule
06.06.2018
SystemExit
. Невозможно сделать и то, и другое в одной и той же функции. - person roippi   schedule 21.01.2014raise SystemExit
без возврата должно быть нормально, илиsys.exit()
, если вы импортировалиsys
, или просто запустите поток управления с конца скрипта. - person user2357112 supports Monica   schedule 21.01.2014