From 7d20534c60448c26e6c819d10da5c005d1617605 Mon Sep 17 00:00:00 2001 From: appleb_m Date: Thu, 2 Jul 2026 17:37:29 +0200 Subject: [PATCH] tell_backend: all exceptions where being caught and squashed/renamed. Hopefully fixed, may lead to strange error behaviours for other fails. --- src/aare/daq/daq.py | 18 ++++++++-- tests/unit/daq/test_mount.py | 64 ++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+), 2 deletions(-) diff --git a/src/aare/daq/daq.py b/src/aare/daq/daq.py index d27ca656..cb3cb49f 100644 --- a/src/aare/daq/daq.py +++ b/src/aare/daq/daq.py @@ -503,7 +503,14 @@ class AareDAQ: f"Original error: {error}" ) logger.critical(message) - raise CriticalTellException(message) from error + raise JFJochCommunicationError( + message, + operation=getattr(error, "operation", None), + endpoint=getattr(error, "endpoint", None), + base_url=getattr(error, "base_url", None), + status_code=getattr(error, "status_code", None), + critical=True, + ) from error def _raise_if_critical_bec_error( self, @@ -520,7 +527,14 @@ class AareDAQ: f"Original error: {error}" ) logger.critical(message) - raise CriticalTellException(message) from error + raise BECCommunicationError( + message, + operation=getattr(error, "operation", None), + endpoint=getattr(error, "endpoint", None), + base_url=getattr(error, "base_url", None), + exception=getattr(error, "exception", None), + critical=True, + ) from error def _ensure_not_in_maintenance(self, *, context: str) -> None: if self.__cfg.state == BeamlineStateEnum.Maintenance: diff --git a/tests/unit/daq/test_mount.py b/tests/unit/daq/test_mount.py index 8737705a..47f88dfe 100644 --- a/tests/unit/daq/test_mount.py +++ b/tests/unit/daq/test_mount.py @@ -5,6 +5,7 @@ from unittest.mock import MagicMock import pytest from aareDB import SampleEventType +from aare.common.exception_handler import BECCommunicationError, JFJochCommunicationError from aare.common.models import DewarAddress, SampleShortInfo, DAQOperation from aare.common.tell_models import TellActivityEnum, TellPhaseEnum, TellStateModel from aare.daq.config import ABR_POS_MOUNT, BeamlineStateEnum @@ -56,6 +57,7 @@ def test_create_mounting_service_builds_expected_context(mock_logger, bare_daq): assert service.ctx.deps.devs is bare_daq._AareDAQ__devs assert service.ctx.settings.mount_position == ABR_POS_MOUNT + def test_was_previous_sample_unmounted_since_prefers_tell_phase_confirmation(): previous_sample = _make_sample(1, "old") daq = _make_daq(previous_sample) @@ -208,6 +210,68 @@ def test_execute_mount_and_prepare_unmount_success_uses_unmount_operation(): assert daq._AareDAQ__set_state.call_args_list[-1].args[0] == BeamlineStateEnum.SampleAlignment +def test_raise_if_critical_jfjoch_detector_error_preserves_jfjoch_exception_family(): + daq = object.__new__(AareDAQ) + + original = JFJochCommunicationError( + "DAQ state error: detector must be idle", + operation="measure", + endpoint="/measurement/start", + base_url="http://detector", + status_code=500, + ) + + with pytest.raises(JFJochCommunicationError) as exc_info: + daq._raise_if_critical_jfjoch_detector_error(original, command="wait_till_done") + + exc = exc_info.value + assert "Critical detector error while running JFJoch command 'wait_till_done'" in str(exc) + assert exc.operation == "measure" + assert exc.endpoint == "/measurement/start" + assert exc.base_url == "http://detector" + assert exc.status_code == 500 + assert exc.critical is True + assert exc.__cause__ is original + + +def test_raise_if_critical_bec_error_preserves_bec_exception_family(): + daq = object.__new__(AareDAQ) + + original_exc = RuntimeError("planner disconnected") + original = BECCommunicationError( + "BEC operation failed", + operation="planner.move_to:data_collection", + endpoint="/bec", + base_url="redis://bec", + exception=original_exc, + ) + + with pytest.raises(BECCommunicationError) as exc_info: + daq._raise_if_critical_bec_error(original, command="planner.move_to:data_collection") + + exc = exc_info.value + assert "Critical BEC error while running 'planner.move_to:data_collection'" in str(exc) + assert exc.operation == "planner.move_to:data_collection" + assert exc.endpoint == "/bec" + assert exc.base_url == "redis://bec" + assert exc.exception is original_exc + assert exc.critical is True + assert exc.__cause__ is original + + +def test_raise_if_critical_jfjoch_detector_error_ignores_non_critical_jfjoch_errors(): + daq = object.__new__(AareDAQ) + + original = JFJochCommunicationError( + "temporary detector hiccup", + operation="measure", + endpoint="/measurement/start", + status_code=503, + ) + + assert daq._raise_if_critical_jfjoch_detector_error(original, command="wait_till_done") is None + + def test_create_loop_centering_service_uses_shared_screenshot_service(): daq = object.__new__(AareDAQ) daq._AareDAQ__cfg = SimpleNamespace()