title: How should I correctly handle exceptions in Python3
body: <p>I can't understand what sort of exceptions I should handle 'here and now', and what sort of exceptions I should re-raise or just don't handle here, and what to do with them later (on higher tier). For example: I wrote client/server application using python3 with ssl communication. Client is supposed to verify files on any differences on them, and if diff exists then it should send this 'updated' file to server.</p>
  
  <pre><code>
  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()
  </code></pre>
  
  <p>Is it right way to use exceptions in python? The problem is: what if file.read() throws IOError? Should I handle it here, or just do nothing and catch it later? And many other possible exceptions?</p>
  
  <ol>
  <li>Client use this class (BasicConnection) to send updated files to server:</li>
  </ol>
  
  <pre><code>
  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
  </code></pre>
  
  <p>Is it correct? May be someone spend his own time and just help me to understand pythonic style of handling exceptions? I can't understand what to do with such exceptions as NameError, TypeError, KeyError, ValueError...and so on.......They could be thrown at any statement, at any time... and what to do with them, if I want to logged everything.</p>
  
  <ol start="2">
  <li><p>And what information should people usually log? If error occurs, what info about it I should log? All traceback, or just relevant message about it or something else?</p></li>
  <li><p>I hope somebody helps me.
  Thanks a lot.</p></li>
  </ol>