docs: def async_or_fail(self, **options):
          """
          Attempt to call self.apply_async, but if that fails with an exception,
          we fake the task completion using the exception as the result. This
          allows us to seamlessly handle errors on task creation the same way we
          handle errors when a task runs, simplifying the user interface.
          """
          args = options.pop("args", None)
          kwargs = options.pop("kwargs", None)
          possible_broker_errors = self._get_possible_broker_errors_tuple()
          try:
              return self.apply_async(args, kwargs, **options)
          except possible_broker_errors as e:
              return self.simulate_async_error(e)