code: async def close(self, exception: BaseException = None) -> None:
          
          self._check_closed()
          self._closed = True
  
          exceptions = []
          for callback, pass_exception in reversed(self._teardown_callbacks):
              try:
                  retval = callback(exception) if pass_exception else callback()
                  if isawaitable(retval):
                      await retval
              except Exception as e:
                  exceptions.append(e)
  
          del self._teardown_callbacks
          if exceptions:
              raise TeardownError(exceptions)
docs: Close this context and call any necessary resource teardown callbacks.
  
          If a teardown callback returns an awaitable, the return value is awaited on before calling
          any further teardown callbacks.
  
          All callbacks will be processed, even if some of them raise exceptions. If at least one
          callback raised an error, this method will raise a :exc:`~.TeardownError` at the end.
  
          After this method has been called, resources can no longer be requested or published on
          this context.
  
          :param exception: the exception, if any, that caused this context to be closed
          :raises .TeardownError: if one or more teardown callbacks raise an exception