@@ -64,18 +64,14 @@ def __repr__(self):
6464 return "(type=%r, value=%r, traceback=%r)" % (self .type , self .value , self .traceback )
6565
6666 def __reduce__ (self ):
67+ # The traceback is not picklable so we need to remove it. Also, some custom exception
68+ # values aren't picklable either. For user convenience, we try first to serialize it and
69+ # we remove the value in case or error. As an optimization, we could have re-used the
70+ # dumped value during unpickling, but this requires using "pickle.loads()" which is
71+ # flagged as insecure by some security tools.
6772 try :
68- pickled_value = pickle .dumps (self .value )
73+ pickle .dumps (self .value )
6974 except pickle .PickleError :
7075 return (RecordException , (self .type , None , None ))
7176 else :
72- return (RecordException ._from_pickled_value , (self .type , pickled_value , None ))
73-
74- @classmethod
75- def _from_pickled_value (cls , type_ , pickled_value , traceback_ ):
76- try :
77- value = pickle .loads (pickled_value )
78- except pickle .PickleError :
79- return cls (type_ , None , traceback_ )
80- else :
81- return cls (type_ , value , traceback_ )
77+ return (RecordException , (self .type , self .value , None ))
0 commit comments