Извиняюсь, если этот вопрос задавался ранее, но я не смог найти аналогичный вопрос и надеялся, что SO порекомендует мне один, как я напечатал.
Сценарий: созданные вручную папки с подпапками и файлами. На каждом уровне папок я хочу выполнять определенную функцию. Вместо того, чтобы вызывать исключение каждый раз, когда возникает ошибка, я хотел бы распечатать их и продолжить цикл, чтобы в конце у меня был полный список ошибок.
Вот MWE, использующий упрощенные функции того, как выглядит мой код:
import os, stat
def folder_info(folder):
if len(folder) > 20:
raise Exception('Folder {} name too long'.format(folder))
print(folder)
subfolders = os.listdir(folder)
return len(folder), subfolders
raise_error = False
folders = [f for f in os.listdir() if os.path.isdir(f)]
for folder in folders:
try:
length, subfolders = folder_info(folder)
except Exception as error:
if raise_error: raise
print('Error: {}'.format(error))
continue
for subfolder in subfolders:
subfolder = os.path.join(folder, subfolder)
try:
length, subfolders = folder_info(subfolder)
except Exception as error:
if raise_error: raise
print('Error: {}'.format(error))
continue
В идеале мне бы хотелось, чтобы мне не нужно было печатать операторы try
и except
для каждого вложенного цикла. На что я надеюсь:
for folder in folders:
arg1, arg2 = exceptionwrapper(myfunction1(folder), raise_error)
for subfolder in arg2:
subfolder = os.path.join(folder, subfolder)
arg1, arg2, arg3 = exceptionwrapper(myfunction2(subfolder), raise_error)
for subsubfolder in arg3:
arg1, arg2 = exceptionwrapper(myfunction3(subsubfolders), raise_error)
Я пробовал следующие решения с функциями декоратора, но я не смог передать continue
или выяснить, куда он должен идти. Это моя лучшая попытка, и при попытке передать синтаксическую ошибку continue
:
def exceptionwrapper(function, raise_error, after_error: function = continue):
def decorator(func):
def new_func(*args, **kwargs):
try:
return func(*args, **kwargs)
except Exception as error:
if raise_error: raise
print('Error: {}'.format(error))
return after_error
return new_func
return decorator
Буду признателен за любую помощь!