繁体   English   中英

遇到Python错误后继续循环

[英]Continuing a loop after encountering an error in Python

这个问题与关于异常处理的其他问题略有不同。

我正在尝试使用一个名为SynoACL的Python模块在Synology NAS上的文件夹上设置权限,该模块包装了Synology NASes上包含的(否则文献不多)SynoACLTool: https : //github.com/zub2/synoacl

我的代码获取目录中所有子目录的列表。 子目录全部以AD中的现有用户命名,我试图让它们修改共享其名称的文件夹的权限(它们将成为网络上的用户共享)。 该脚本会引发错误,但是尽管发生错误,它实际上仍成功设置了权限。 问题在于它仅对目录中的第一个子目录执行此操作,并且由于该错误而不会继续执行其他任何子目录。 我尝试将其设置为忽略所有异常,但仍然失败。 这是我的代码以及错误,其中删除了个人信息:

错误:

    Traceback (most recent call last):
  File "synologyusershareperms.py", line 19, in <module>
    SynoACLTool.add(".", SynoACL.fromString(folderPermString))
  File "/volume1/@appstore/py3k/usr/local/lib/python3.5/site-packages/synoacl/tool.py", line 406, in add
    return SynoACLTool._parseACLResult(SynoACLTool._communicate(["-add", path, str(acl)]))
  File "/volume1/@appstore/py3k/usr/local/lib/python3.5/site-packages/synoacl/tool.py", line 370, in _communicate
    return subprocess.check_output([ SynoACLTool._SYNOACL_CMD ] + args, universal_newlines = True).split("\n")
  File "/volume1/@appstore/py3k/usr/local/lib/python3.5/subprocess.py", line 629, in check_output
    **kwargs).stdout
  File "/volume1/@appstore/py3k/usr/local/lib/python3.5/subprocess.py", line 711, in run
    output=stdout, stderr=stderr)
subprocess.CalledProcessError: Command '['synoacltool', '-add', '.', 'user:DOMAINNAME\\username:allow:rwxpd-aARWc--:fd--']' returned non-zero exit status 255

码:

import os
from synoacl.tool import SynoACL, SynoACLTool
user_share_path = '/path/to/share/'
permTemplate1 = "user:DOMAINNAME\\"
permTemplate2 = ":allow:rwxpd-aARWc--:fd--"

os.chdir(user_share_path)
cwd = os.getcwd()
print(cwd)

folderList = os.listdir()
try:
    for folderName in folderList:
        os.chdir(folderName)
        cwd = os.getcwd()
        print(cwd)
        folderPermString = permTemplate1 + folderName + permTemplate2
        print(folderPermString)
        SynoACLTool.add(".", SynoACL.fromString(folderPermString))
        os.chdir("..")
except:
    pass

由于添加了try和except行,因此不再抛出任何错误,但是在第一个循环之后停止。 尽管有错误,有什么办法让它继续执行循环?

编辑:一条评论建议将try放入for循环中,似乎没有解决问题:

for folderName in folderList:
    try:
        os.chdir(folderName)
        cwd = os.getcwd()
        print(cwd)
        folderPermString = permTemplate1 + folderName + permTemplate2
        print(folderPermString)
        SynoACLTool.add(".", SynoACL.fromString(folderPermString))
        os.chdir("..")
    except:
        pass

将try / except块放入for循环中:

for folderName in folderList:
    try:
        os.chdir(folderName)
        cwd = os.getcwd()
        print(cwd)
        folderPermString = permTemplate1 + folderName + permTemplate2
        print(folderPermString)
        SynoACLTool.add(".", SynoACL.fromString(folderPermString))
        os.chdir("..")
    except:
        pass

您也可以这样做(如果您不想在捕获异常时做任何事情)

# contextlib module
from contextlib import suppress

with suppress(Exception):
    os.chdir(folderName)
    cwd = os.getcwd()
    print(cwd)
    folderPermString = permTemplate1 + folderName + permTemplate2
    print(folderPermString)
    SynoACLTool.add(".", SynoACL.fromString(folderPermString))
    os.chdir("..")

替换此行

except:

通过

except Exception as ex:

因此:

import os
from builtins import Exception
user_share_path = '/path/to/share/'
permTemplate1 = "user:DOMAINNAME\\"
permTemplate2 = ":allow:rwxpd-aARWc--:fd--"

os.chdir(user_share_path)
cwd = os.getcwd()
print(cwd)

folderList = os.listdir()

for folderName in folderList:
   try:
       os.chdir(folderName)
       cwd = os.getcwd()
       print(cwd)
       folderPermString = permTemplate1 + folderName + permTemplate2
       print(folderPermString)
       SynoACLTool.add(".", SynoACL.fromString(folderPermString))
       os.chdir("..")
    except Exception as ex:
      print(ex)
      pass

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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