Недавно я узнал о python декораторах, поэтому я попробовал и спроектировал декоратор так:
def retry(repeat,error_return=None):
def decorator(function):
def wrapper(*args,**kwargs):
nonlocal repeat
while repeat>0:
try:
return function(*args,**kwargs)
except Exception as e:
repeat=repeat-1
print(e)
return error_return
return wrapper
return decorator
Если во время выполнения оформленной функции возникло исключение, исключение не возникнет. И функция будет повторяться в течение определенного времени до того, как будет напечатано исключение.
Я использовал декоратор на простом загрузчике, например:
@retry(3)
def download_single(url,path):
........
content=requests.get(url,timeout=10).content
with open(path,'w') as f:
f.write(content)
print('Downloaded'+path)
def download_all(alist):
for url in alist:
download_single(url,PATH)
Обычно, и, как я и ожидал, он должен работать следующим образом:
Однако в некоторых случаях программа просто останавливается после того, как напечатано исключение: >> left">
Так с какой стати это останавливается само собой ?? (Список URL содержит более 1000 элементов, и он остановился на 37)
И это случалось много раз на разных элементах. Так что это не проблема определенного URL.
И это та же проблема, когда я запускаю программу прямо из консоли. Так что это не потому, что IDLE тоже.
Это проблема с декоратором или загрузчиком? Таким образом, он завершается только сразу после исключения, поэтому я думаю, что исключение вызвало тихий выход. Кто-нибудь встречал подобные случаи раньше?