<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 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)