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
的实现使得无法从错误中恢复。它只在内部处理。