Python 如何忽略调用rglob时发生的异常?

Python 如何忽略调用rglob时发生的异常?,python,pathlib,Python,Pathlib,我正在使用pathlib.Path.rglob浏览目录层次结构中的一些文件。但是,无法解析其中一个(sub-…)目录,并引发异常 import pathlib for file in pathlib.Path(r'\\path\to\shared\folder').rglob('*.foo'): pass # OSError: [WinError 59] An unexpected network error occurred 捕获for循环的主体中的异常毫无意义,因为该异常发生在rglo

我正在使用
pathlib.Path.rglob
浏览目录层次结构中的一些文件。但是,无法解析其中一个(sub-…)目录,并引发异常

import pathlib
for file in pathlib.Path(r'\\path\to\shared\folder').rglob('*.foo'):
  pass
# OSError: [WinError 59] An unexpected network error occurred
捕获
for
循环的
主体中的异常毫无意义,因为该异常发生在
rglob
中。将整个循环放在
try
块中确实捕获了异常,但是我无法恢复计算


有没有人知道如何使用
pathlib.Path.rglob
?解决方法是使用旧的
os.walk
,但我想知道这个据说更现代的工具的解决方案。

首先,尝试在python shell中运行
filepath=Path(r'\\Path\to\shared\folder').rglob('*.foo')
,看看它是否完成且没有错误。如果是这样,您可以尝试在迭代期间捕获运行时异常(可能是由于不稳定的网络连接)

def try_loop(g):
    while True:
        try:
            yield next(g)
        except StopIteration:
            break
        except OSError as e:
            # log error
            continue
然后将
rglob
调用包装到
try\u loop
函数中

for file in try_loop(pathlib.Path(r'\\path\to\shared\folder').rglob('*.foo')):
    pass

这是由一个更一般的问题启发而来的。

您链接的问题中的公认答案指出,生成器在抛出异常后退出。那么,您的
try\u loop
函数有什么意义呢?@Aran-Fey确实,生成器没有经过错误文件夹,因此这相当于外部
try/except
块(即使它只捕获生成器的异常,而不是整个循环体的异常)。函数的
try\u loop
不能保证在出现异常后可以继续循环。它只会抑制错误,这样您就不需要使用try块来封闭整个循环。
rglob
的实现使得无法从错误中恢复。它只在内部处理。