diff --git a/cloudpickle/cloudpickle.py b/cloudpickle/cloudpickle.py index 45cffe5ba..2d53cbba2 100644 --- a/cloudpickle/cloudpickle.py +++ b/cloudpickle/cloudpickle.py @@ -262,6 +262,8 @@ def dump(self, obj): if 'recursion' in e.args[0]: msg = """Could not pickle object as excessively deep recursion required.""" raise pickle.PicklingError(msg) + else: + raise def save_memoryview(self, obj): self.save(obj.tobytes()) diff --git a/tests/cloudpickle_test.py b/tests/cloudpickle_test.py index 5b1bbcb19..30a407268 100644 --- a/tests/cloudpickle_test.py +++ b/tests/cloudpickle_test.py @@ -49,6 +49,15 @@ HAVE_WEAKSET = hasattr(weakref, 'WeakSet') +class RaiserOnPickle(object): + + def __init__(self, exc): + self.exc = exc + + def __reduce__(self): + raise self.exc + + def pickle_depickle(obj): """Helper function to test whether object pickled with cloudpickle can be depickled with pickle @@ -763,6 +772,12 @@ def test_function_pickle_compat_0_4_1(self): b'\x14NtR.') self.assertEquals(42, cloudpickle.loads(pickled)(42)) + def test_pickle_reraise(self): + for exc_type in [Exception, ValueError, TypeError, RuntimeError]: + obj = RaiserOnPickle(exc_type("foo")) + with pytest.raises((exc_type, pickle.PicklingError)): + cloudpickle.dumps(obj) + if __name__ == '__main__': unittest.main()