Skip to content

Implicit Exception chains are not pickled. #60

Description

@bernardpazio

Explicit exceptions those given with the from syntax when raising an exception are pickled, however ones which are called with out this are not.

excepted:

def chain_exception():
    try:
        raise Exception('Foo')
    except Exception as ex:
        try:
            raise Exception('Bar')
        except Exception as e:
            raise Exception('explict') from e

chain_exception()
Exception chain
Traceback (most recent call last):
  File "<ipython-input-14-53e847eef0b4>", line 5, in chain_exception
    raise Exception('Foo')
Exception: Foo

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<ipython-input-14-53e847eef0b4>", line 8, in chain_exception
    raise Exception('Bar')
Exception: Bar

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/bert/.conda/envs/dask-dev/lib/python3.8/site-packages/IPython/core/interactiveshell.py", line 3343, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-14-53e847eef0b4>", line 12, in <module>
    chain_exception()
  File "<ipython-input-14-53e847eef0b4>", line 10, in chain_exception
    raise Exception('explict') from e
Exception: explict

after pickling:

import pickle
import tblib.pickling_support
tblib.pickling_support.install()

try:
    chain_exception()
except Exception as e:
    pickled_e = pickle.dumps(e, protocol=pickle.HIGHEST_PROTOCOL)

raise pickled_e
Exception chain
Traceback (most recent call last):
  File "<ipython-input-14-53e847eef0b4>", line 8, in chain_exception
    raise Exception('Bar')
Exception: Bar

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/bert/.conda/envs/dask-dev/lib/python3.8/site-packages/IPython/core/interactiveshell.py", line 3343, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-15-269163ec6143>", line 8, in <module>
    raise pickle.loads(pickled_e)
  File "<ipython-input-15-269163ec6143>", line 2, in <module>
    chain_exception()
  File "<ipython-input-14-53e847eef0b4>", line 10, in chain_exception
    raise Exception('explict') from e
Exception: explict

I believe this is simply due to the fact that __cause__ attribute is pickled but the __context__ one is not. See PEP 3134 for further details on this.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions