title: Why a custom exception must have default parameter when raised in ProcessPoolExecutor?
body: <p>I have a ProcessPoolExecutor and want to raise a custom exception in it. But it only works without breaking the process pool when it has a default parameter or used in super init or just go around that super init function.
  I have no clue about this behaviour.
  On Py3.7 and 3.8 this is shown:
  <code>A process in the process pool was terminated abruptly while the future was running or pending.</code>
  Any Ideas?</p>
  
  <pre class="lang-py prettyprint-override"><code>from concurrent.futures.process import ProcessPoolExecutor
  
  
  class PoolBreaker(Exception):
      def __init__(self, num):
          super().__init__()
          self.num = num
  
  
  class NoPoolBreaker(Exception):
      def __init__(self, num=0):
          super().__init__()
          self.num = num
  
  
  class NoPoolBreaker2(Exception):
      def __init__(self, num):
          super().__init__(num)
          self.num = num
  
  
  class NoPoolBreaker3(Exception):
      def __init__(self, num):
          self.num = num
  
  
  def get_result(job):
      exc = job.exception()
      if type(exc) is PoolBreaker:
          print("PoolBreaker", exc.num)
      elif type(exc) is NoPoolBreaker:
          print("NoPoolBreaker", exc.num)
      elif type(exc) is NoPoolBreaker2:
          print("NoPoolBreaker2", exc.num)
      elif type(exc) is NoPoolBreaker3:
          print("NoPoolBreaker3", exc.num)
      else:
          print(f"Exception: {str(exc)}")
  
  
  def work(x: int):
      if x == 0:
          raise PoolBreaker(x)
      elif x == 1:
          raise NoPoolBreaker(x)
      elif x == 2:
          raise NoPoolBreaker2(x)
      elif x == 3:
          raise NoPoolBreaker3(x)
  
  
  if __name__ == '__main__':
      for num in range(0, 4):
          with ProcessPoolExecutor() as executor:
              job = executor.submit(work, num)
          get_result(job)
  </code></pre>