从看门狗处理OSError [英] Handling OSError from Watchdog
问题描述
我一直在使用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()
.
然后将MyEmitter
与BaseObserver
结合使用,我们现在可以处理丢失和恢复与共享驱动器的连接.
Then use MyEmitter
with BaseObserver
, we can now handle losing and regaining connection to shared drives.
这篇关于从看门狗处理OSError的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!