我试图理解如何在Python中使用正确的错误处理。 我让看门狗在一张联网的光盘里查我的文件夹。有时光盘很快就会断开连接,然后再次连接,并弹出一个错误。”线程2出现异常:“
我有一个错误的处理,但我不确定我做得对。在
我要不要再试一次观察员计划台阶?在
Python 3.6、Windows 10
if __name__ == '__main__':
path = "P:\\03_auto\\Indata"
observer = Observer()
observer.schedule(MyHandler(), path, recursive=True)
observer.start()
try:
while True:
time.sleep(1)
except keyboardInterrupt:
observer.stop()
observer.join()
好吧,我在评论中提到的}。在该错误的消息线程中列出了一些解决方法,但是我很高兴使用一个变通方法来发布一个答案,特别是这个bug最终似乎得到了python3.8的修复。
sys.excepthook
方法目前不可行。有一个已有十多年历史的bug使得从threading.Thread
派生的线程忽略{另一种选择是从看门狗的观察者派生一个定制的观察者。 我能想到的最基本的方法是父级
run()
方法的包装:通过快速浏览源代码,所有观察者似乎都从^{} 继承了他们的
^{pr2}$run
,因此您甚至可以省略包装器并直接重新实现该方法但是,我的盒子上没有安装这个软件包,所以这些东西还没有经过测试;你可能得在这上面瞎搞一番。 哦,并且确保用实际引发的异常类替换
OSError
*。)编辑:
*根据@HenryYik下面的评论,断开网络驱动器的连接在Windows系统上似乎引发了一个
OSError
(winerror64:ERROR_NETNAME_DELETED)。我发现在这种情况下,UNIX风格的操作系统很可能会引发相同类型的异常,因此我更新了代码片段,现在使用OSError
,而不是原来使用的FileNotFoundError
。在我也把这个贴在了一个相关的帖子here
我就是这样解决这个问题的:
子类化
WindowsApiEmitter
以捕获queue_events
中的异常。为了在重新连接后继续,watchdog需要重新设置目录句柄,我们可以使用self.on_thread_start()
来进行设置。在然后将
MyEmitter
与BaseObserver
一起使用,我们现在可以处理丢失和恢复到共享驱动器的连接。在我认为
super().run()
不是一个好答案。 我试过很多东西来回答希米的问题,但它并不具体,也没有意义。在下面是我的答案。 我已经完成了测试。在
相关问题 更多 >
编程相关推荐