code: def test_0_add_throwing_cleaner(self):
      module_code = """
  import pandas as pd
  
  def throwing_cleaner(data: pd.DataFrame, err_msg: str):
      assert isinstance(data, pd.DataFrame)
      raise Exception(err_msg)
  """
      create_custom_module("custom_cleaners.py", module_code)
  
      # Create base json ai
      df = pd.read_csv("tests/data/hdi.csv").iloc[0:400]
      json_ai = json_ai_from_problem(
          df,
          ProblemDefinition.from_dict(
              {"target": "Development Index", "time_aim": 20}
          ),
      )
  
      # modify it
      json_ai_dump = json_ai.to_dict()
      json_ai_dump["cleaner"] = {
          "module": "custom_cleaners.throwing_cleaner",
          "args": {"err_msg": f'"{test_err_message}"'},
      }
  
      json_ai = JsonAI.from_dict(json_ai_dump)
  
      # create a predictor from it
      code = code_from_json_ai(json_ai)
      predictor = predictor_from_code(code)
      try:
          predictor.learn(df)
      except Exception as e:
          assert str(e) == test_err_message
          return
  
      raise Exception("Predictor did not contain modified function!")
  
file_path: lightwood/tests/integration/advanced/test_custom_modules.py
imports: from lightwood.api.high_level import json_ai_from_problem, code_from_json_ai, predictor_from_code, load_custom_module
  from lightwood.api.types import JsonAI, ProblemDefinition
  import unittest
  import os
  import pandas
label_desc: Use image node_id 1 for calling the TestBasic obj's underlying member method code with example usage: obj.test_0_add_throwing_cleaner() without return types