code: def test_actor_exception(self):
      port = get_free_tcp_port()
      master = Master(port=port, device="gpu")
      th = threading.Thread(target=master.run)
      th.start()
      time.sleep(3)
      worker1 = Worker("localhost:{}".format(port), 0, None, "0")
      for _ in range(3):
          if master.gpu_num == 1:
              break
          time.sleep(10)
      self.assertEqual(1, master.gpu_num)
      parl.connect("localhost:{}".format(port))
  
      with self.assertRaises(exceptions.FutureFunctionError):
          actor = Actor(abcd="a bug")
          actor.get_arg1()  # calling any function will raise an exception
  
      actor2 = Actor()
      for _ in range(3):
          if master.gpu_num == 0:
              break
          time.sleep(10)
  
      future_result = actor2.add_one(1)
      self.assertEqual(future_result.get(), 2)
      self.assertEqual(0, master.gpu_num)
  
      master.exit()
      worker1.exit()
  
imports: import unittest
  import parl
  import time
  import subprocess
  import threading
  from parl.remote.master import Master
  from parl.remote.worker import Worker
  from parl.remote.client import disconnect
  from parl.remote import exceptions
  from parl.utils import get_free_tcp_port
label_desc: Use image node_id 2 for calling the TestCluster obj's underlying member method code with example usage: obj.test_actor_exception() without return types