My, not so nice, solution is the following: The idea is that we catch the exception e in the forked process and just return it as the object e. Then, after calling this forked process, we check whether the returned value is in fact an exception. If so, we raise it. Of course this has several drawbacks (what if a function really wants to return an exception? also the traceback gets more complicated) but seems to work okay for me. If anyone has a nicer solution, I would be very interested to learn about it!
def encode_exceptions(func, *args, **kwargs) :
try :
ret = func(*args, **kwargs)
return ret
except Exception as e:
return e
def decode_exceptions(ret) :
if isinstance(ret, Exception) :
raise ret
else :
return ret
def fork_func(func, *args, **kwargs) :
@fork
def forked_func():
return encode_exceptions(func, *args, **kwargs)
ret = forked_func()
return decode_exceptions(ret)
def test() :
raise ValueError("Found a value error")
print(fork_func(test))