从看门狗处理OSError [英] Handling OSError from Watchdog

查看:162
本文介绍了从看门狗处理OSError的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在使用tkinter组合的看门狗模块来处理一些上传请求.在大多数情况下,它可以正常工作,但有时我们的网络驱动器会变得不稳定并在一定时间内断开连接.但是我找不到正确的位置来捕获此错误.

I have been using tkinter combined watchdog module to handle some uploading requests. Most of the time it works fine, but sometimes our network drive goes unstable and disconnects for certain amount of time. However i am unable to find the correct place to catch this error.

from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import tkinter as tk

root = tk.Tk()
path = [r"Network path 1",r"Network path 2"]

class MyGui:
    def __init__(self,master):
        self.master = master
        self.but = tk.Button(master,text="Click to start observer",command=self.start_observer)
        self.but.pack()

    def start_observer(self):
        for i in path:
            observer.schedule(event_handler, path=i, recursive=False)
        observer.start()
        self.but.config(state="disabled",text="observer started")
        print ("Observer started")

class MyHandler(FileSystemEventHandler):
    def on_created(self, event):
        current_file = event.src_path
        print (current_file)

event_handler = MyHandler()
observer = Observer()

gui = MyGui(root)
root.mainloop()

这是我让它运行几天后得到的:

This is what i got after letting it run for a couple days:

Exception in thread Thread-4:
Traceback (most recent call last):
  File "C:\Users\AppData\Local\Programs\Python\Python37\lib\threading.py", line 917, in _bootstrap_inner
    self.run()
  File "C:\Users\AppData\Local\Programs\Python\Python37\lib\site-packages\watchdog\observers\api.py", line 146, in run
    self.queue_events(self.timeout)
  File "C:\Users\AppData\Local\Programs\Python\Python37\lib\site-packages\watchdog\observers\read_directory_changes.py", line 75, in queue_events
    winapi_events = read_events(self._handle, self.watch.is_recursive)
  File "C:\Users\AppData\Local\Programs\Python\Python37\lib\site-packages\watchdog\observers\winapi.py", line 346, in read_events
    buf, nbytes = read_directory_changes(handle, recursive)
  File "C:\Users\AppData\Local\Programs\Python\Python37\lib\site-packages\watchdog\observers\winapi.py", line 306, in read_directory_changes
    raise e
  File "C:\Users\AppData\Local\Programs\Python\Python37\lib\site-packages\watchdog\observers\winapi.py", line 302, in read_directory_changes
    ctypes.byref(nbytes), None, None)
  File "C:\Users\AppData\Local\Programs\Python\Python37\lib\site-packages\watchdog\observers\winapi.py", line 107, in _errcheck_bool
    raise ctypes.WinError()
OSError: [WinError 64] The specified network name is no longer available.

有人可以建议如何正确处理此异常吗?

Can anyone suggest how to handle this exception correctly?

推荐答案

这是我解决此问题的方法:

This is how i solved this problem:

    from watchdog import observers
    from watchdog.observers.api import DEFAULT_OBSERVER_TIMEOUT, BaseObserver


    class MyEmitter(observers.read_directory_changes.WindowsApiEmitter):
        def queue_events(self, timeout):
            try:
                super().queue_events(timeout)
            except OSError as e:
                print(e)
                connected = False
                while not connected:
                    try:
                        self.on_thread_start()  # need to re-set the directory handle.
                        connected = True
                        print('reconnected')
                    except OSError:
                        print('attempting to reconnect...')
                        time.sleep(10)


    observer = BaseObserver(emitter_class=MyEmitter, timeout=DEFAULT_OBSERVER_TIMEOUT)
    ...

子类化WindowsApiEmitter以捕获queue_events中的异常.为了在重新连接后继续运行,看门狗需要重新设置目录句柄,我们可以使用self.on_thread_start()进行此操作.

Subclassing WindowsApiEmitter to catch the exception in queue_events. In order to continue after reconnecting, watchdog needs to re-set the directory handle, which we can do with self.on_thread_start().

然后将MyEmitterBaseObserver结合使用,我们现在可以处理丢失和恢复与共享驱动器的连接.

Then use MyEmitter with BaseObserver, we can now handle losing and regaining connection to shared drives.

这篇关于从看门狗处理OSError的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆