code: def finish(self, exception=None):
          
          if self._finished:
              return
          self._finished = True
          serializer = None
          if exception is None:
              fields = self._successFields
              fields[ACTION_STATUS_FIELD] = SUCCEEDED_STATUS
              if self._serializers is not None:
                  serializer = self._serializers.success
          else:
              fields = _error_extraction.get_fields_for_exception(
                  self._logger, exception)
              fields[EXCEPTION_FIELD] = "%s.%s" % (
                  exception.__class__.__module__, exception.__class__.__name__)
              fields[REASON_FIELD] = safeunicode(exception)
              fields[ACTION_STATUS_FIELD] = FAILED_STATUS
              if self._serializers is not None:
                  serializer = self._serializers.failure
  
          fields.update(self._identification)
          Message(fields, serializer).write(self._logger, self)
docs: Log the finish message.
  
          The action identification fields, and any additional given fields,
          will be logged.
  
          In general you shouldn't call this yourself, instead using a C{with}
          block or L{Action.finish}.
  
          @param exception: C{None}, in which case the fields added with
              L{Action.addSuccessFields} are used. Or an L{Exception}, in
              which case an C{"exception"} field is added with the given
              L{Exception} type and C{"reason"} with its contents.