Called to parse the object as described in this parsing plan, using the provided arguments for the parser.
        * Exceptions are caught and wrapped into ParsingException
        * If result does not match expected type, an error is thrown

        :param logger: the logger to use during parsing (optional: None is supported)
        :param options: a dictionary of option sets. Each option set is identified with an id in the dictionary.
        :return:

def execute(self, logger: Logger, options: Dict[str, Dict[str, Any]]) -> T:
        """
        Called to parse the object as described in this parsing plan, using the provided arguments for the parser.
        * Exceptions are caught and wrapped into ParsingException
        * If result does not match expected type, an error is thrown

        :param logger: the logger to use during parsing (optional: None is supported)
        :param options: a dictionary of option sets. Each option set is identified with an id in the dictionary.
        :return:
        """
        try:
            res = self._execute(logger, options)
        except Exception as e:
            raise ParsingException.create_for_caught_error(self.parser, self.obj_type, self.obj_on_fs_to_parse, e,
                                                           options)

        # Check that the returned parsed object has the correct type
        if res is not None:
            if robust_isinstance(res, self.obj_type):
                return res

        # wrong type : error
        raise WrongTypeCreatedError.create_for_wrong_result_type(self.parser, self.obj_type, self.obj_on_fs_to_parse,
                                                                 res, options)