Tôi không thể hiểu loại ngoại lệ nào tôi nên xử lý 'ở đây và bây giờ' và loại ngoại lệ nào tôi nên nâng cao hoặc không xử lý ở đây và làm với chúng sau này (trên tầng cao hơn). Ví dụ: tôi đã viết ứng dụng khách/máy chủ bằng python3 với giao tiếp ssl. Khách hàng là nghĩa vụ phải xác minh các tập tin trên bất kỳ sự khác biệt về họ, và nếu khác tồn tại sau đó nó sẽ gửi tập tin 'cập nhật' này đến máy chủ.Làm cách nào để xử lý chính xác ngoại lệ trong Python3
class BasicConnection:
#blablabla
def sendMessage(self, sock, url, port, fileToSend, buffSize):
try:
sock.connect((url, port))
while True:
data = fileToSend.read(buffSize)
if not data: break
sock.send(data)
return True
except socket.timeout as toErr:
raise ConnectionError("TimeOutError trying to send File to remote socket: %s:%d"
% (url,port)) from toErr
except socket.error as sErr:
raise ConnectionError("Error trying to send File to remote socket: %s:%d"
% (url,port)) from sErr
except ssl.SSLError as sslErr:
raise ConnectionError("SSLError trying to send File to remote socket: %s:%d"
% (url,port)) from sslErr
finally:
sock.close()
Có đúng cách để sử dụng ngoại lệ trong python không? Vấn đề là: nếu file.read() ném IOError thì sao? Tôi có nên xử lý nó ở đây, hoặc chỉ không làm gì và bắt nó sau này? Và nhiều ngoại lệ có thể khác?
- Khách hàng sử dụng lớp này (BasicConnection) để gửi các file cập nhật vào máy chủ:
class PClient():
def __init__(self, DATA):
'''DATA = { 'sendTo' : {'host':'','port':''},
'use_ssl' : {'use_ssl':'', 'fileKey':'', 'fileCert':'', 'fileCaCert':''},
'dirToCheck' : '',
'localStorage': '',
'timeToCheck' : '',
'buffSize' : '',
'logFile' : ''} '''
self._DATA = DATA
self._running = False
self.configureLogging()
def configureLogging(self):
#blablabla
def isRun(self):
return self._running
def initPClient(self):
try:
#blablabla
return True
except ConnectionError as conErr:
self._mainLogger.exception(conErr)
return False
except FileCheckingError as fcErr:
self._mainLogger.exception(fcErr)
return False
except IOError as ioErr:
self._mainLogger.exception(ioErr)
return False
except OSError as osErr:
self._mainLogger.exception(osErr)
return False
def startPClient(self):
try:
self._running = True
while self.isRun():
try :
self._mainLogger.debug("Checking differences")
diffFiles = FileChecker().checkDictionary(self._dict)
if len(diffFiles) != 0:
for fileName in diffFiles:
try:
self._mainLogger.info("Sending updated file: %s to remote socket: %s:%d"
% (fileName,self._DATA['sendTo']['host'],self._DATA['sendTo']['port']))
fileToSend = io.open(fileName, "rb")
result = False
result = BasicConnection().sendMessage(self._sock, self._DATA['sendTo']['host'],
self._DATA['sendTo']['port'], fileToSend, self._DATA['buffSize'])
if result:
self._mainLogger.info("Updated file: %s was successfully delivered to remote socket: %s:%d"
% (fileName,self._DATA['sendTo']['host'],self._DATA['sendTo']['port']))
except ConnectionError as conErr:
self._mainLogger.exception(conErr)
except IOError as ioErr:
self._mainLogger.exception(ioErr)
except OSError as osErr:
self._mainLogger.exception(osErr)
self._mainLogger.debug("Updating localStorage %s from %s " %(self._DATA['localStorage'], self._DATA['dirToCheck']))
FileChecker().updateLocalStorage(self._DATA['dirToCheck'],
self._DATA['localStorage'])
self._mainLogger.info("Directory %s were checked" %(self._DATA['dirToCheck']))
time.sleep(self._DATA['timeToCheck'])
except FileCheckingError as fcErr:
self._mainLogger.exception(fcErr)
except IOError as ioErr:
self._mainLogger.exception(ioErr)
except OSError as osErr:
self._mainLogger.exception(osErr)
except KeyboardInterrupt:
self._mainLogger.info("Shutting down...")
self.stopPClient()
except Exception as exc:
self._mainLogger.exception(exc)
self.stopPClient()
raise RuntimeError("Something goes wrong...") from exc
def stopPClient(self):
self._running = False
Is it correct? Có thể ai đó dành thời gian riêng của mình và chỉ giúp tôi hiểu phong cách xử lý ngoại lệ của pythonic? Tôi không thể hiểu phải làm gì với những ngoại lệ như NameError, TypeError, KeyError, ValueError ... và cứ thế ....... Họ có thể bị ném vào bất kỳ tuyên bố nào, bất cứ lúc nào ... và phải làm gì với họ, nếu tôi muốn đăng nhập mọi thứ.
Và thông tin nào mọi người thường đăng nhập? Nếu xảy ra lỗi, tôi nên đăng nhập thông tin gì? Tất cả traceback, hoặc chỉ là thông điệp có liên quan về nó hay cái gì khác?
Tôi hy vọng có ai đó giúp tôi. Cảm ơn rất nhiều.
mẫn hữu ích của một số "cảm xúc ruột" đi kèm với trải nghiệm với python. Tôi háo hức chờ đợi các thực hành tốt nhất của Python - nhưng không phải trước các mẫu Python :) –