3737import asyncio
3838import logging
3939import sys
40+
41+ from asyncio import Task
42+ from logging import Logger
4043from typing import Any , Callable , Coroutine
4144
4245from .devices import _AsyncCallback , _LogLevel , _PowersensorDevicesBase
@@ -92,7 +95,7 @@ def __init__(
9295 service_type : str = _SERVICE_TYPE_UDP ,
9396 debounce_timeout : float = _DEBOUNCE_DEFAULT_S ,
9497 relay_now_relaying_for : bool = False ,
95- logger : 'logging. Logger | None' = None ,
98+ logger : Logger | None = None ,
9699 ) -> None :
97100 """Initialise.
98101
@@ -118,6 +121,7 @@ def __init__(
118121 self ._zc_owned = zeroconf_instance is None # True → we close it in stop()
119122 self ._service_type = service_type
120123 self ._debounce_seconds = debounce_timeout
124+ self ._cb_logger = logger
121125 self ._browser : Any = None
122126 self ._listener : _Listener | None = None
123127 self ._pending_removals : dict [str , asyncio .TimerHandle ] = {}
@@ -223,8 +227,15 @@ async def _on_zc_remove(self, mac: str) -> None:
223227 def _internal_callback (self , coro : _InternalCallback ) -> None :
224228 """Helper to prevent gc collection of short-lived callback tasks."""
225229 task = asyncio .create_task (coro )
230+
231+ def cleanup (task : Task [None ]) -> None :
232+ self ._internal_callbacks .discard (task )
233+ e = task .exception ()
234+ if e is not None and not task .cancelled ():
235+ self ._maybe_log (_LogLevel .ERROR , 'Exception escaped callback: %s' , e )
236+
226237 self ._internal_callbacks .add (task )
227- task .add_done_callback (self . _internal_callbacks . discard )
238+ task .add_done_callback (cleanup )
228239
229240
230241 class _Listener (_zc .ServiceListener ):
0 commit comments