def watch(self, keys, on_watch, filters=None, start_revision=None, return_previous=None):
        """
        Watch one or more keys or key sets and invoke a callback.

        Watch watches for events happening or that have happened. The entire event history
        can be watched starting from the last compaction revision.

        :param keys: Watch these keys / key sets.
        :type keys: list of bytes or list of instance of :class:`txaioetcd.KeySet`

        :param on_watch: The callback to invoke upon receiving
            a watch event.
        :type on_watch: callable

        :param filters: Any filters to apply.

        :param start_revision: start_revision is an optional
            revision to watch from (inclusive). No start_revision is "now".
        :type start_revision: int

        :param return_previous: Flag to request returning previous values.

        :returns: A deferred that just fires when watching has started successfully,
            or which fires with an error in case the watching could not be started.
        :rtype: twisted.internet.Deferred
        """
        d = self._start_watching(keys, on_watch, filters, start_revision, return_previous)

        #
        #   ODD: Trying to use a parameter instead of *args errors out as soon as the
        #        parameter is accessed.
        #
        def on_err(*args):
            if args[0].type not in [CancelledError, ResponseFailed]:
                self.log.warn('etcd watch terminated with "{error}"', error=args[0].type)
                return args[0]

        d.addErrback(on_err)
        return d