Skip to content

Commit

Permalink
Fix #1184 Add exception handling for socket mode - BlockingIOError: R…
Browse files Browse the repository at this point in the history
…esource temporarily unavailable (#1185)
  • Loading branch information
seratch committed Feb 19, 2022
1 parent eec08f4 commit 9d9a6e1
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 9 deletions.
13 changes: 11 additions & 2 deletions slack_sdk/socket_mode/builtin/client.py
Expand Up @@ -247,10 +247,15 @@ def _on_message(self, message: str):
listener(message)

def _on_error(self, error: Exception):
self.logger.exception(
error_message = (
f"on_error invoked (session id: {self.session_id()}, "
f"error: {type(error).__name__}, message: {error})"
)
if self.trace_enabled:
self.logger.exception(error_message)
else:
self.logger.error(error_message)

for listener in self.on_error_listeners:
listener(error)

Expand Down Expand Up @@ -281,10 +286,14 @@ def _run_current_session(self):
f" (session id: {session_id})"
)
except Exception as e:
self.logger.exception(
error_message = (
"Failed to start or stop the current session"
f" (session id: {session_id}, error: {e})"
)
if self.trace_enabled:
self.logger.exception(error_message)
else:
self.logger.error(error_message)

def _monitor_current_session(self):
if self.current_app_monitor_started:
Expand Down
34 changes: 27 additions & 7 deletions slack_sdk/socket_mode/builtin/connection.py
Expand Up @@ -167,9 +167,11 @@ def connect(self) -> None:
if e.args and len(e.args) > 1 and isinstance(e.args[0], int):
code = e.args[0]
if code is not None:
self.logger.exception(
f"Error code: {code} (session id: {self.session_id}, error: {e})"
)
error_message = f"Error code: {code} (session id: {self.session_id}, error: {e})"
if self.trace_enabled:
self.logger.exception(error_message)
else:
self.logger.error(error_message)
raise

except Exception as e:
Expand Down Expand Up @@ -300,10 +302,15 @@ def check_state(self) -> None:
)
self.consecutive_check_state_error_count = 0
except Exception as e:
self.logger.exception(
error_message = (
"Failed to check the state of sock "
f"(session id: {self.session_id}, error: {type(e).__name__}, message: {e})"
)
if self.trace_enabled:
self.logger.exception(error_message)
else:
self.logger.error(error_message)

self.consecutive_check_state_error_count += 1
if self.consecutive_check_state_error_count >= 5:
self.disconnect()
Expand Down Expand Up @@ -452,28 +459,41 @@ def run_until_completion(self, state: ConnectionState) -> None:
if self.on_error_listener is not None:
self.on_error_listener(e)
else:
self.logger.exception(
error_message = (
"Got an OSError while receiving data"
f" (session id: {self.session_id}, error: {e})"
)
if self.trace_enabled:
self.logger.exception(error_message)
else:
self.logger.error(error_message)

# As this connection no longer works in any way, terminating it
if self.is_active():
try:
self.disconnect()
except Exception as disconnection_error:
self.logger.exception(
error_message = (
"Failed to disconnect"
f" (session id: {self.session_id}, error: {disconnection_error})"
)
if self.trace_enabled:
self.logger.exception(error_message)
else:
self.logger.error(error_message)
state.terminated = True
break
except Exception as e:
if self.on_error_listener is not None:
self.on_error_listener(e)
else:
self.logger.exception(
error_message = (
"Got an exception while receiving data"
f" (session id: {self.session_id}, error: {e})"
)
if self.trace_enabled:
self.logger.exception(error_message)
else:
self.logger.error(error_message)

state.terminated = True

0 comments on commit 9d9a6e1

Please sign in to comment.