[英]Python: Generalised try-except wrapper for standalone and for loop continue
抱歉,是否曾经有人问过这个问题,但是我找不到类似的问题,希望我能像我键入的那样向我推荐一个问题。
方案:带有子文件夹和文件的手动创建的文件夹。 我想在文件夹的每个级别执行特定功能。 与其每次遇到错误都不会引发异常,我想将它们打印出来并继续执行循环,因此最后我会列出错误的完整列表。
这是使用我的代码的简化功能的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
任何帮助,将不胜感激!
如果可以使用os.walk ,那么可以用Pythonic
方式用几行代码来编写整个代码。
import os
for root, folders, files in os.walk(os.getcwd()):
for folder in folders:
print('dir is: ', folder)
try:
if len(folder) > 20:
raise Exception('Folder {} name too long'.format(folder))
except Exception as error_message:
print('Error in folder: {} due to: {}'.format(folder, error_message))
正如您在不同的文件夹级别中指定的那样,您必须调用不同的函数,您可以尝试如下操作:
import os
curr_folder = os.getcwd()
for root, folders, files in os.walk(curr_folder):
for folder in folders:
print('dir is: ', folder)
folder_level = root[len(curr_folder)+1:].count(os.sep)
print('level is: ', folder_level)
if folder_level == 0:
# call myfunction0
pass
elif folder_level == 1:
# call myfunction1
pass
elif folder_level == 2:
# call myfunction2
pass
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.