Open
Description
There are a few places where assert
statements are used in MMCore and DeviceBase.h, such as here.
If these lines fail, the python runtime will crash out back to terminal.
Example:
from contextlib import suppress
from pymmcore import CMMCore, StateDevice
core = CMMCore()
mm_path = "/Users/talley/Library/Application Support/pymmcore-plus/mm/Micro-Manager-2.0.2-20230810"
core.setDeviceAdapterSearchPaths([mm_path])
core.loadDevice("StateDev", "DemoCamera", "DWheel")
core.loadDevice("Camera", "DemoCamera", "DCam")
# ============ No problem here, just runtime error we go on
with suppress(RuntimeError):
core.getState("NotADevice")
# ============ No problem here: Camera is a device, but not a state device
with suppress(RuntimeError):
core.getState("Camera") # Also just
# ============ Unless we uncomment core.initializeDevice, we abort
# StateDev IS a state device... but `CreateIntegerProperty(MM::g_Keyword_State`
# hasn't been called by the adapter yet
# core.initializeDevice("StateDev") # <- the fix
assert core.getDeviceType("StateDev") is StateDevice # (it is)
with suppress(Exception): # <- doesn't help
core.getState("StateDev") # Abort: GetPosition, file DeviceBase.h, line 2287.
@marktsuchida, curious to hear your thoughts. Is a full crash something we could prevent here? would it be at the level of mmCoreAndDevices (by swapping those asserts for something else), at the level of SWIG (by catching them somehow and re-reraising), or all the way at the level of pymmcore-plus or something, by (laboriously) trying to make sure you don't do something like call getState
on an uninitialized stateDevice?
Metadata
Metadata
Assignees
Labels
No labels