code: def pickle_exception(obj):
      # All exceptions, unlike generic Python objects, define __reduce_ex__
      # __reduce_ex__(4) should be no different from __reduce_ex__(3).
      # __reduce_ex__(5) could bring benefits in the unlikely case the exception
      # directly contains buffers, but PickleBuffer objects will cause a crash when
      # running on protocol=4, and there's no clean way to figure out the current
      # protocol from here. Note that any object returned by __reduce_ex__(3) will
      # still be pickled with protocol 5 if pickle.dump() is running with it.
      rv = obj.__reduce_ex__(3)
      if isinstance(rv, str):
          raise TypeError("str __reduce__ output is not supported")
      assert isinstance(rv, tuple) and len(rv) >= 2
  
      return (
          unpickle_exception,
          rv[:2] + (obj.__cause__, obj.__traceback__),
      ) + rv[2:]
  
file_path: mars/mars/lib/tblib/pickling_support.py
imports: import sys
  from types import TracebackType
  from .None import Frame
  from .None import Traceback
label_desc: Use image node_id 4 for calling a global function with example usage: pickle_exception(obj) and returns: unknown