From 3c2e52cff428b2ee091e2ef1992526c9d33d3145 Mon Sep 17 00:00:00 2001 From: Antoine Pitrou Date: Wed, 13 Dec 2017 16:39:04 +0100 Subject: [PATCH] Fix #129: do not silence RuntimeError in dump() (#140) --- cloudpickle/cloudpickle.py | 2 ++ tests/cloudpickle_test.py | 15 +++++++++++++++ 2 files changed, 17 insertions(+) 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()