Как игнорировать исключения, возникающие при вызове rglob? - PullRequest
2 голосов
/ 20 марта 2019

Я использую pathlib.Path.rglob для просмотра некоторых файлов в иерархии каталогов. Однако один из каталогов (sub-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, но мне было бы интересно узнать решение для этого предположительно более современного инструмента.

1 Ответ

1 голос
/ 20 марта 2019

Прежде всего, попробуйте запустить filePaths = Path(r'\\path\to\shared\folder').rglob('*.foo') в вашей оболочке python, чтобы увидеть, завершится ли он без ошибки. Если это так, вы можете попытаться перехватить исключения во время выполнения (возможно, из-за нестабильного сетевого подключения) во время итерации.

def try_loop(g):
    while True:
        try:
            yield next(g)
        except StopIteration:
            break
        except OSError as e:
            # log error
            continue

Затем включите вызов rglob в функцию try_loop

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

Это основано на более общем вопросе "Обработка исключения, сгенерированного в генераторе" .

...