def _exec_check(self, check: FontbakeryCallable, args: Dict[str, Any]):
    """ Yields check sub results.

    Each check result is a tuple of: (<Status>, mixed message)
    `status`: must be an instance of Status.
          If one of the `status` entries in one of the results
          is FAIL, the whole check is considered failed.
          WARN is most likely a PASS in a non strict mode and a
          FAIL in a strict mode.
    `message`:
      * If it is an `Exception` type we expect `status`
        not to be PASS
      * If it is a `string` it's a description of what passed
        or failed.
      * we'll think of an AdvancedMessageType as well, so that
        we can connect the check result with more in depth
        knowledge from the check definition.
    """
    try:
      # A check can be either a normal function that returns one Status or a
      # generator that yields one or more. The latter will return a generator
      # object that we can detect with types.GeneratorType.
      result = check(**args)  # Might raise.

      if isinstance(result, types.GeneratorType):
        # Iterate over sub-results one-by-one, list(result) would abort on
        # encountering the first exception.
        for sub_result in result:  # Might raise.
          yield self._check_result(sub_result)
        return  # Do not fall through to rest of method.
    except Exception as e:
      error = FailedCheckError(e)
      result = (ERROR, error)

    yield self._check_result(result)