Skip to content

Commit e26663f

Browse files
committed
Propagate exceptions from action threads
1 parent ea56731 commit e26663f

File tree

2 files changed

+9
-0
lines changed

2 files changed

+9
-0
lines changed

src/labthings/actions/thread.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ def __init__(
8585
self._request_time: datetime.datetime = datetime.datetime.now()
8686
self._start_time: Optional[datetime.datetime] = None # Task start time
8787
self._end_time: Optional[datetime.datetime] = None # Task end time
88+
self._exception: Optional[Exception] = None # Propagate exceptions helpfully
8889

8990
# Public state properties
9091
self.progress: Optional[int] = None # Percent progress of the task
@@ -218,6 +219,7 @@ def wrapped(*args, **kwargs):
218219
logging.error(traceback.format_exc())
219220
self._return_value = str(e)
220221
self._status = "error"
222+
self._exception = e
221223
raise e
222224
finally:
223225
self._end_time = datetime.datetime.now()

src/labthings/views/__init__.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,13 @@ def dispatch_request(self, *args, **kwargs):
234234
if task.output and isinstance(task.output, ResponseBase):
235235
return self.represent_response((task.output, 200))
236236

237+
# If the action fails quickly, propagate the exception.
238+
# This allows us to handle validation errors nicely.
239+
# TODO: do we want to do this for all exceptions, or just
240+
# werkzeug.exceptions.HTTPException instances?
241+
if task._exception is not None:
242+
raise e
243+
237244
return self.represent_response((ActionSchema().dump(task), 201))
238245

239246

0 commit comments

Comments
 (0)