繁体   English   中英

Python:独立和for循环的通用try-except包装器

[英]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

理想情况下,我希望不必为每个嵌套循环键入tryexcept语句。 我希望的是:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM