input: Write a function to extract features from a json string. The function should return a dictionary containing the 'id', 'title', and the length of the 'body' from the input json string. If the input json string is malformed or does not contain the required fields, the function should handle the exception gracefully.
  assert feature_extraction('{"id":111,"title":"This is a sample title","body":"This is a sample body text"}')=={"id": 111, "title": "This is a sample title", "body_len": 30}
  assert feature_extraction('{"id":222,"title":"Another title","body":"Short text"}')=={"id": 222, "title": "Another title", "body_len": 10}
  assert feature_extraction('{"id":333,"title":"","body":""}')=={"id": 333, "title": "", "body_len": 0}
  assert feature_extraction('{"id":444,"body":"Very long text"}')=={"id": 444, "title": None, "body_len": 14}
  assert feature_extraction('{"title":"No ID provided","body":"Text"}')=={"id": None, "title": "No ID provided", "body_len": 5}
output: try:
      data = json.loads(json_string)
      id_val = data.get('id', None)
      title_val = data.get('title', None)
      body_len = len(data.get('body', ''))
      return {"id": id_val, "title": title_val, "body_len": body_len}
  except json.JSONDecodeError:
      return {"id": None, "title": None, "body_len": None}