mirror of
https://github.com/zulip/zulip.git
synced 2025-11-04 22:13:26 +00:00
timeout: Re-raise from where the TimeoutExpired hit the thread.
Having just thrown an exception into the thread, it is often useful to know _what_ was the slow code that we interrupted. Raising a bare TimeoutExpired here obscures that information, as any `exc_info` will end there. Examine the thread for any exception information, and use that to re-raise. This exception information is not guaranteed to exist -- if the thread didn't respond to the exception in time, or caught it, for instance.
This commit is contained in:
committed by
Tim Abbott
parent
85eeaf5f18
commit
e714264756
@@ -78,11 +78,14 @@ def timeout(timeout: float, func: Callable[[], ResultT]) -> ResultT:
|
|||||||
time.sleep(0.1)
|
time.sleep(0.1)
|
||||||
if not thread.is_alive():
|
if not thread.is_alive():
|
||||||
break
|
break
|
||||||
|
if thread.exc_info[1] is not None:
|
||||||
|
# Re-raise the exception we sent, if possible, so the
|
||||||
|
# stacktrace originates in the slow code
|
||||||
|
raise thread.exc_info[1].with_traceback(thread.exc_info[2])
|
||||||
raise TimeoutExpired
|
raise TimeoutExpired
|
||||||
|
|
||||||
if thread.exc_info[1] is not None:
|
if thread.exc_info[1] is not None:
|
||||||
# Raise the original stack trace so our error messages are more useful.
|
# Died with some other exception; re-raise it
|
||||||
# from https://stackoverflow.com/a/4785766/90777
|
|
||||||
raise thread.exc_info[1].with_traceback(thread.exc_info[2])
|
raise thread.exc_info[1].with_traceback(thread.exc_info[2])
|
||||||
assert thread.result is not None # assured if above did not reraise
|
assert thread.result is not None # assured if above did not reraise
|
||||||
return thread.result
|
return thread.result
|
||||||
|
|||||||
Reference in New Issue
Block a user