code: def _raise_on_error(self):
          
          self._exception = None
  
          # We explicitly don't catch around this yield because in the unlikely
          # event that an exception was hit in the block we don't want to swallow
          # it.
          yield
          if self._exception is not None:
              exception, self._exception = self._exception, None
              self.close()
              raise exception
docs: A context manager that can be used to wrap calls that do I/O from
          SecureTransport. If any of the I/O callbacks hit an exception, this
          context manager will correctly propagate the exception after the fact.
          This avoids silently swallowing those exceptions.
  
          It also correctly forces the socket closed.