Halo semua,
Saat memantau folder di dalam QNAP, saya bisa mendapatkan acara untuk file yang baru dibuat. Namun, jika file baru adalah direktori, pengawas lumpuh karena kesalahan sistem.
Saya menduga itu karena file masih disalin, tetapi itu seharusnya tidak menjadi alasan untuk membuat crash pendengar.
Aplikasi berjalan di Windows 8.1 Pro.
Versi firmware QNAP: 3.7.2 Build 20120719
Jejak Tumpukan:
Exception in thread Thread-3:
Traceback (most recent call last):
File "C:\Python34\lib\threading.py", line 920, in _bootstrap_inner
self.run()
File "C:\Python34\lib\site-packages\watchdog-0.8.3-py3.4.egg\watchdog\observers\api.py", line 146, in run
self.queue_events(self.timeout)
File "C:\Python34\lib\site-packages\watchdog-0.8.3-py3.4.egg\watchdog\observers\read_directory_changes.py", line 77, in queue_events
winapi_events = read_events(self._handle, self.watch.is_recursive)
File "C:\Python34\lib\site-packages\watchdog-0.8.3-py3.4.egg\watchdog\observers\winapi.py", line 347, in read_events
buf, nbytes = read_directory_changes(handle, recursive)
File "C:\Python34\lib\site-packages\watchdog-0.8.3-py3.4.egg\watchdog\observers\winapi.py", line 307, in read_directory_changes
raise e
File "C:\Python34\lib\site-packages\watchdog-0.8.3-py3.4.egg\watchdog\observers\winapi.py", line 303, in read_directory_changes
ctypes.byref(nbytes), None, None)
File "C:\Python34\lib\site-packages\watchdog-0.8.3-py3.4.egg\watchdog\observers\winapi.py", line 108, in _errcheck_bool
raise ctypes.WinError()
OSError: [WinError 58] The specified server cannot perform the requested operation.
Masalah yang sama di sekitar sini, dengan WinError 64 dan pesan: Nama jaringan yang ditentukan tidak lagi tersedia. Ini terjadi ketika folder disajikan dari server file yang menjadi tidak tersedia (berbagi SMB).
Bagaimana kita bisa menangkap kesalahan semacam ini, untuk mencoba lagi melampirkan pengamat nanti?
Saya juga sekarang mencari solusi untuk menunda/mencoba lagi utas dirwatcher di:
OSError: [WinError 64] Nama jaringan yang ditentukan tidak lagi tersedia
Saya memiliki masalah yang sama ketika saya mendapatkan pesan WinError 64 saat memantau berbagi file jarak jauh. Saya akhirnya membuat pembungkus kecil di sekitar kelas watchdog.utils.BaseThread yang memungkinkan saya menangkap kesalahan dan memulihkannya. Saya kemudian monkeypatch kelas BaseThread asli dengan pembungkus saya sebelum membuat Pengamat. Dalam kasus khusus saya, saya menangkap pengecualian apa pun yang dapat terjadi dalam metode run dan menambahkannya ke antrian untuk dikonsumsi dari utas yang berbeda. Ini adalah solusi peretasan, tetapi tidak banyak opsi tanpa perubahan kode sumber.
import logging
import threading
import watchdog.utils
logger = logging.getLogger(__name__)
class BaseThreadWrapper(watchdog.utils.BaseThread):
"""
Wrapper around watchdog BaseThread class.
"""
queue = None
def __init__(self):
super(BaseThreadWrapper, self).__init__()
self._original_run = self.run
self.run = self.run_wrapper
def run_wrapper(self):
try:
self._original_run()
except Exception as e:
logger.exception('%s thread exited with error',
threading.current_thread().name)
self.queue.put(e)
watchdog.utils.BaseThread = BaseThreadWrapper
Solusi apa (perubahan kode) yang ingin Anda lihat di pengawas?
Komentar yang paling membantu
Saya juga sekarang mencari solusi untuk menunda/mencoba lagi utas dirwatcher di:
OSError: [WinError 64] Nama jaringan yang ditentukan tidak lagi tersedia