Python:用于独立和循环继续的通用try-except包装器
如果以前有人问过这个问题,我表示歉意,但我找不到类似的问题,希望SO能在我打字时向我推荐一个 场景:手动创建包含子文件夹和文件的文件夹。在每个级别的文件夹中,我都希望执行特定的功能。我不希望每次遇到错误时都引发异常,而是将它们打印出来并继续循环,以便在最后有一个完整的错误列表 下面是一个MWE,它使用了我的代码的简化函数:Python:用于独立和循环继续的通用try-except包装器,python,for-loop,exception,Python,For Loop,Exception,如果以前有人问过这个问题,我表示歉意,但我找不到类似的问题,希望SO能在我打字时向我推荐一个 场景:手动创建包含子文件夹和文件的文件夹。在每个级别的文件夹中,我都希望执行特定的功能。我不希望每次遇到错误时都引发异常,而是将它们打印出来并继续循环,以便在最后有一个完整的错误列表 下面是一个MWE,它使用了我的代码的简化函数: import os, stat def folder_info(folder): if len(folder) > 20: raise Exc
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
和语句,除了
语句。我希望的是:
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)
我尝试了使用decorator函数的以下解决方案,但无法传入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
任何帮助都将不胜感激 如果您可以使用的话,您的整个代码可以用
Pythonic
的方式写成几行
正如您在不同的文件夹级别中指定的,您必须调用不同的函数,您可以尝试如下操作:
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
如果您可以使用的话,您的整个代码可以用
Pythonic
的方式写在几行代码中
正如您在不同的文件夹级别中指定的,您必须调用不同的函数,您可以尝试如下操作:
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
谢谢你的建议。不幸的是,我举的例子可能太简单了。在不同的子文件夹级别,我使用不同的功能(
myfunction1
,myfunction2
,等等,就像在我的理想代码块中一样),因此在这种情况下,os.walk
不起作用。谢谢你的建议。不幸的是,我举的例子可能太简单了。在不同的子文件夹级别,我使用不同的函数(myfunction1
,myfunction2
,等等,就像在我的理想代码块中一样),因此在这种情况下,os.walk
不起作用。