docs: def get_file_encoding(self, file_path, preferred_encoding=None):
          """
          Gets an eventual cached encoding for file_path.
  
          Raises a KeyError if no encoding were cached for the specified file
          path.
  
          :param file_path: path of the file to look up
          :returns: The cached encoding.
          """
          _logger().debug('getting encoding for %s', file_path)
          try:
              map = json.loads(self._settings.value('cachedFileEncodings'))
          except TypeError:
              map = {}
          try:
              return map[file_path]
          except KeyError:
              encodings = self.preferred_encodings
              if preferred_encoding:
                  encodings.insert(0, preferred_encoding)
              for encoding in encodings:
                  _logger().debug('trying encoding: %s', encoding)
                  try:
                      with open(file_path, encoding=encoding) as f:
                          f.read()
                  except (UnicodeDecodeError, IOError, OSError):
                      pass
                  else:
                      return encoding
              raise KeyError(file_path)