Хорошо, подход sys.excepthook
, о котором я упоминал в своем комментарии, на данный момент неосуществим. Существует более чем десятилетняя ошибка , из-за которой потоки, полученные из threading.Thread
, игнорируют sys.excepthook
. В ветке сообщений об этой ошибке описаны некоторые обходные пути, но я не решаюсь опубликовать ответ, используя обходной путь, тем более что эта ошибка, наконец, исправлена в Python 3.8.
Другой вариант - получить пользовательский Observer из Watchdog's Observer.
Самый простой способ, которым я могу придумать, - это обертка вокруг метода run()
родителя:
class CustomObserver(Observer):
def run(self):
while self.should_keep_running():
try:
# Tweak the super call if you require compatibility with Python 2
super().run()
except OSError:
# You did not mention the excpetion class in your post.
# Be specific about what you want to handle here
# give the file system some time to recover
time.sleep(.5)
Судя по быстрому взгляду на источник, все наблюдатели, похоже, наследуют свои run
от EventDispatcher.run()
, так что вы, вероятно, даже можете опустить обертку и переопределить этот метод напрямую
class CustomObserver(Observer):
def run(self):
while self.should_keep_running():
try:
self.dispatch_events(self.event_queue, self.timeout)
except queue.Empty:
continue
except OSError:
time.sleep(.5)
Однако у меня не установлен этот пакет на моей коробке, так что эти вещи не проверены; вам, возможно, придется немного повозиться, чтобы все началось.
Да, и обязательно замените OSError
* на любой класс исключений, который действительно возникает в вашем случае:)
Изменить:
* В соответствии с комментарием @ HenryYik ниже, отключение сетевого диска, похоже, вызывает OSError
(WinError 64: ERROR_NETNAME_DELETED) в системах Windows. Я считаю вполне вероятным, что ОС в стиле UNIX в той же ситуации вызывают исключение того же типа, поэтому я обновил фрагменты кода, чтобы теперь использовать OSError
вместо FileNotFoundError
, который я использовал изначально.