diff --git a/aioesphomeapi/_frame_helper/base.pxd b/aioesphomeapi/_frame_helper/base.pxd index 9b5a389..187be7a 100644 --- a/aioesphomeapi/_frame_helper/base.pxd +++ b/aioesphomeapi/_frame_helper/base.pxd @@ -5,7 +5,6 @@ from ..connection cimport APIConnection cdef bint TYPE_CHECKING -cdef object WRITE_EXCEPTIONS cdef class APIFrameHelper: diff --git a/aioesphomeapi/_frame_helper/base.py b/aioesphomeapi/_frame_helper/base.py index 624f6f0..d0d0407 100644 --- a/aioesphomeapi/_frame_helper/base.py +++ b/aioesphomeapi/_frame_helper/base.py @@ -19,7 +19,6 @@ SOCKET_ERRORS = ( TimeoutError, ) -WRITE_EXCEPTIONS = (RuntimeError, ConnectionResetError, OSError) _int = int _bytes = bytes @@ -189,9 +188,4 @@ class APIFrameHelper: if TYPE_CHECKING: assert self._writer is not None, "Writer is not set" - try: - self._writer(data) - except WRITE_EXCEPTIONS as err: - raise SocketClosedAPIError( - f"{self._log_name}: Error while writing data: {err}" - ) from err + self._writer(data) diff --git a/aioesphomeapi/connection.pxd b/aioesphomeapi/connection.pxd index 110b919..62aa99c 100644 --- a/aioesphomeapi/connection.pxd +++ b/aioesphomeapi/connection.pxd @@ -13,6 +13,8 @@ cdef object HANDSHAKE_TIMEOUT cdef bint TYPE_CHECKING +cdef object WRITE_EXCEPTIONS + cdef object DISCONNECT_REQUEST_MESSAGE cdef tuple DISCONNECT_RESPONSE_MESSAGES cdef tuple PING_REQUEST_MESSAGES @@ -46,6 +48,7 @@ cdef object ReadFailedAPIError cdef object TimeoutAPIError cdef object SocketAPIError cdef object InvalidAuthAPIError +cdef object SocketClosedAPIError cdef object astuple @@ -57,8 +60,8 @@ cdef object CONNECTION_STATE_CLOSED cdef object make_hello_request -cpdef handle_timeout(object fut) -cpdef handle_complex_message( +cpdef void handle_timeout(object fut) +cpdef void handle_complex_message( object fut, list responses, object do_append, @@ -130,7 +133,7 @@ cdef class APIConnection: cdef void _set_connection_state(self, object state) - cpdef report_fatal_error(self, Exception err) + cpdef void report_fatal_error(self, Exception err) @cython.locals(handlers=set) cdef void _add_message_callback_without_remove(self, object on_message, tuple msg_types) diff --git a/aioesphomeapi/connection.py b/aioesphomeapi/connection.py index 2a30bcd..840d4e6 100644 --- a/aioesphomeapi/connection.py +++ b/aioesphomeapi/connection.py @@ -46,6 +46,7 @@ from .core import ( ReadFailedAPIError, ResolveAPIError, SocketAPIError, + SocketClosedAPIError, TimeoutAPIError, UnhandledAPIConnectionError, ) @@ -95,6 +96,8 @@ CONNECT_REQUEST_TIMEOUT = 30.0 # to reboot and connect to the network/WiFi. TCP_CONNECT_TIMEOUT = 60.0 +WRITE_EXCEPTIONS = (RuntimeError, ConnectionResetError, OSError) + _int = int _bytes = bytes @@ -667,12 +670,16 @@ class APIConnection: try: self._frame_helper.write_packets(packets, debug_enabled) - except SocketAPIError as err: + except WRITE_EXCEPTIONS as err: # If writing packet fails, we don't know what state the frames # are in anymore and we have to close the connection _LOGGER.info("%s: Error writing packets: %s", self.log_name, err) - self.report_fatal_error(err) - raise + wrapped_err = SocketClosedAPIError( + f"{self.log_name}: Error writing packets: {err}" + ) + wrapped_err.__cause__ = err + self.report_fatal_error(wrapped_err) + raise wrapped_err from err def _add_message_callback_without_remove( self, on_message: Callable[[Any], None], msg_types: tuple[type[Any], ...]