No puedo entender qué tipo de excepciones debo manejar 'aquí y ahora', y qué tipo de excepciones debería volver a plantear o simplemente no manejar aquí, y qué hacer con ellos más tarde (en el nivel superior). Por ejemplo: escribí una aplicación cliente/servidor usando python3 con comunicación ssl. Se supone que el cliente verifica los archivos en cualquier diferencia sobre ellos, y si existe diff, entonces debe enviar este archivo 'actualizado' al servidor.¿Cómo debo manejar correctamente las excepciones en 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()
¿Es correcto usar excepciones en python? El problema es: ¿qué ocurre si file.read() arroja IOError? ¿Debo manejarlo aquí, o simplemente no hacer nada y atraparlo más tarde? Y muchas otras posibles excepciones?
- cliente utilizan esta clase (BasicConnection) para enviar archivos actualizados al servidor:
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
¿Es correcto? ¿Puede ser que alguien pase su propio tiempo y simplemente me ayude a entender el estilo pítico de manejar excepciones? No puedo entender qué hacer con excepciones como NameError, TypeError, KeyError, ValueError ... y así sucesivamente ... Se podrían lanzar en cualquier declaración, en cualquier momento ... y qué hacer con ellos, si quiero registrar todo.
¿Y qué información debe la gente generalmente registra? Si ocurre un error, ¿qué información debo registrar? ¿Todo rastreo, o solo mensaje relevante sobre él o algo más?
Espero que alguien me ayude. Muchas gracias.
introspección útil de algunos "sentimientos viscerales" que vienen con el experiencia con python. Espero ansiosamente tus mejores prácticas de Python, pero no antes de Python Patterns :) –