में अपवादों को सही तरीके से कैसे संभालना चाहिए, मुझे समझ में नहीं आ रहा है कि मुझे 'यहां और अब' किस तरह के अपवादों को संभालना चाहिए, और मुझे किस तरह के अपवादों को फिर से उठाना चाहिए या बस यहां संभाल नहीं करना चाहिए, और क्या करना है बाद में उनके साथ (उच्च स्तर पर) करें। उदाहरण के लिए: मैंने एसएसएल संचार के साथ python3 का उपयोग कर क्लाइंट/सर्वर एप्लिकेशन लिखा था। क्लाइंट को उन पर किसी भी अंतर पर फ़ाइलों को सत्यापित करना है, और यदि diff मौजूद है तो इसे सर्वर पर 'अपडेट' फ़ाइल भेजनी चाहिए।मुझे 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()
क्या यह पाइथन में अपवादों का उपयोग करने का सही तरीका है? समस्या यह है: क्या होगा अगर file.read() IOError फेंकता है? क्या मुझे इसे यहां संभालना चाहिए, या बस कुछ भी नहीं करना चाहिए और बाद में इसे पकड़ना चाहिए? और कई अन्य संभावित अपवाद?
- क्लाइंट सर्वर से अपडेट की गई फ़ाइलें भेजने के लिए इस वर्ग (BasicConnection) का उपयोग करें:
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
यह सही है? क्या कोई अपना समय बिता सकता है और अपवादों को संभालने की पाइथोनिक शैली को समझने में मेरी मदद कर सकता है? मैं समझ नहीं पा रहा हूं कि नाम अपर, टाइप एरर, कीरर, वैल्यूएरर ... और इतने पर ऐसे अपवादों के साथ क्या करना है ....... उन्हें किसी भी वक्त किसी भी वक्तव्य में फेंक दिया जा सकता है ... और क्या करना है उनके साथ, अगर मैं सबकुछ लॉग करना चाहता हूं।
और लोगों को आम तौर पर किस जानकारी को लॉग करना चाहिए? अगर त्रुटि होती है, तो इसके बारे में मुझे क्या जानकारी चाहिए? सभी ट्रेसबैक, या इसके बारे में सिर्फ प्रासंगिक संदेश या कुछ और?
मुझे उम्मीद है कि कोई मेरी मदद करेगा। बहुत बहुत धन्यवाद।
कुछ "पेट भावनाओं" उस के साथ आने का उपयोगी आत्मनिरीक्षण अजगर के साथ अनुभव। मैं उत्सुकता से आपके पायथन सर्वोत्तम अभ्यासों की प्रतीक्षा करता हूं - लेकिन पाइथन पैटर्न से पहले नहीं :) –