code: def exception(self, timeout=None):
          
          if self._state == self.RUNNING:
              self._context.wait_all_futures([self], timeout)
          return self._exception
docs: Return the exception raised by the call that the future represents.
  
          Args:
              timeout: The number of seconds to wait for the exception if the
                  future isn't done. If None, then there is no limit on the wait
                  time.
  
          Returns:
              The exception raised by the call that the future represents or None
              if the call completed without raising.
  
          Raises:
              TimeoutError: If the future didn't finish executing before the given
                  timeout.