code: def test_actor_exception_2(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")
      self.assertEqual(1, master.gpu_num)
      parl.connect("localhost:{}".format(port))
      actor = Actor()
      with self.assertRaises(exceptions.FutureFunctionError):
          future_object = actor.will_raise_exception_func()
          future_object.get()  # raise exception
  
      actor2 = Actor()
      for _ in range(5):
          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)
      del actor
      del actor2
      worker1.exit()
      master.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 3 for calling the TestCluster obj's underlying member method code with example usage: obj.test_actor_exception_2() without return types