hardbyte / hardbyte/python-can

Errors in callbacks when running async is not calling _on_error()

Abierto
#1,912 1 comentario 1 reacción 0 asignados Ver en GitHub
bug
Lenguaje dominante
Python
Estrellas
1.6k
Forks
697
Métricas de merge de PR
Sin PR fusionados en 30 d

Descripción

If a `Notifier` is created using an asyncio loop, any errors that occurs in the receive callbacks will not call the `Listener._on_error()` callback. It does when not running asyncio.

Looking at `Notifier._rx_thread()`: When a loop is present it will call `Notifier._on_message_received()` using the `self._loop.call_soon_threadsafe()` call. However the `except Exception as exc:` in line 127 will never be reached, because any errors in the `call_soon_threadsafe()` callback does not return the exceptions for the function it calls. This in turn implies that when asyncio is enabled, the `Listener._on_error()` callback won't be called either which is unexpected.

https://github.com/hardbyte/python-can/blob/654a02ae24bfc50bf1bb1fad7aab4aa88763d302/can/notifier.py#L111-L137

The fix would be to either encapsulate `Notifier._on_message_received()` in an except block and call the `_on_error()` call back from it. Another solution is to make it call an extra handler when running async:

```py
def _rx_thread(self, bus: BusABC) -> None:
# determine message handling callable early, not inside while loop
if self._loop:
def rx_handler(msg: Message) -> None:
try:
self._on_message_received(msg)
except Exception as exc:
if not self._on_error(exc):
raise
else:
# It was handled, so only log it
logger.debug("suppressed exception: %s", exc)
handle_message: Callable[[Message], Any] = functools.partial(
self._loop.call_soon_threadsafe,
rx_handler, # type: ignore[arg-type]
)
else:
handle_message = self._on_message_received
...
```

Probably related to #1865

Guía de contribución

Abrir la guía de contribución

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.